4

在 Windows 中,当使用 来创建进程时CreateProcess,可以true作为bInheritHandles参数传递。

CreateProcess( , , , , bInheritHandles, , , , )

这意味着所有标记为可继承的文件句柄实际上都将由子进程继承。

我们如何控制 C++std::fstream类创建的底层文件句柄是否可继承?

4

2 回答 2

3

C 运行时默认创建可继承句柄。

ofstream outFile("filename.txt") ;
CreateProcess("program.exe", ..., true, ...) ; //program.exe will inherit the above file handle

所以,如果你想继承一个句柄,你不需要做任何事情。

如果您不想继承句柄,则必须HANDLE_FLAG_INHERIT使用 WinAPI 函数自己设置句柄的标志SetHandleInformation,如下所示:

FILE* filePtr = fopen("filename.txt", "w") ;
SetHandleInformation( (HANDLE)_get_osfhandle(_fileno(filePtr)), HANDLE_FLAG_INHERIT, 0) ;
ofstream outFile(filePtr) ;

在上面的第三行中,构造函数ofstream(FILE*)是对 Visual Studio 中存在的标准的扩展(我不知道其他编译器)。

在该构造函数之后,filePtr现在由 拥有outFile,因此调用也将outFile.close()关闭filePtr。您可以完全忘记filePtr变量。

文档:fopen_fileno_get_osfhandleSetHandleInformation

于 2019-04-04T14:36:03.233 回答
2

如果您fopen用于打开文件,则可以"N"在参数中指定 Windows 特定模式,fopen以使句柄不可继承。

例子:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  FILE *fp = fopen("SomeFile.txt", "rwN");
  if (!fp) {
    return -1;
  }

  system("SomeProcess.exe");

  fclose(fp);
  return 0;
}

资料来源:

https://wiki.sei.cmu.edu/confluence/display/c/WIN03-C.+Understand+HANDLE+inheritance

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen?view=vs-2019

于 2020-05-28T11:19:18.607 回答