_fsopen()
的工作原理如何? Linux是否也具有类似的打开文件的方式,该方式可以为文件进行后续的基于shflag
的共享读写准备?
引文here。
答案 0 :(得分:4)
_fsopen()的工作原理如何?
您已链接到文档。它按照他们所说的去做。如果您要问如何实现,那么我们将无法回答,因为该信息是专有的。
并且linux是否也具有类似的打开文件的方式,该方式为基于shflg的后续共享读取或写入准备文件?
Linux没有共享模式。这是Windows的怪癖。在Linux或其他类似Unix的操作系统(例如macOS)下,不需要特殊的标志或模式即可在进程之间共享文件。
总体而言,_fsopen()
是C标准库的fopen()
函数的特定于MS的变体。除了与其他操作系统无关的共享模式标志之外,它还以各种其他MS扩展功能的方式执行参数验证。在Linux上,人们要负责验证自己的论点,而仅使用fopen()
。
答案 1 :(得分:1)
在Windows上,使用CreateFileW
函数使用NtCreateFile
系统调用打开文件。
参数dwShareMode
用于指定文件共享策略,并包含标志FILE_SHARE_DELETE
,FILE_SHARE_READ
和FILE_SHARE_WRITE
的组合,这些标志映射到{ {1}}。
如果您想知道该函数的实现方式,那么首先应该记住,MSVCRT尝试支持某种等效的POSIX文件描述符API。然后检查以下功能:
_open_osfhandle
允许您将NT shflag
转换为类似POSIX的文件描述符_fdopen
允许您从文件描述符(相当于POSIX fdopen
函数)中获取_fsopen
。所以可能的实现看起来像这样(用伪代码):
HANDLE
Linux没有提供等效的文件共享策略,因此没有等效的文件共享策略。
PS:另一个相关功能是_wsopen
-结合了FILE *
和FILE *_fsopen(...)
{
HANDLE hFile = CreateFileW(...);
int fd = _open_osfhandle(hFile, ...);
return _fdopen(fd, ...);
}
。