在Windows中,使用CreateProcess
创建进程时,可以将true
作为bInheritHandles
参数传递。
CreateProcess( , , , , bInheritHandles, , , , )
这意味着标记为可继承的所有文件句柄实际上都将由子进程继承。
我们如何控制C ++ std::fstream
类创建的底层文件句柄是否可以继承?
C运行时默认情况下会创建可继承的句柄。
ofstream outFile("filename.txt") ;
CreateProcess("program.exe", ..., true, ...) ; //program.exe will inherit the above file handle
因此,如果您想要继承句柄,则无需执行任何操作。
如果你不想继承句柄,你必须使用WinAPI函数HANDLE_FLAG_INHERIT
自己设置句柄的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
变量。