_fsopen()到底如何工作?

时间:2019-06-12 13:14:17

标签: c msvcrt crt

_fsopen()的工作原理如何? Linux是否也具有类似的打开文件的方式,该方式可以为文件进行后续的基于shflag的共享读写准备?

引文here

2 个答案:

答案 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_DELETEFILE_SHARE_READFILE_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, ...); }