控制由Windows中的C ++ std :: fstream创建的文件句柄的可继承性

问题描述 投票:2回答:1

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

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

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

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

c++ winapi fstream child-process filehandle
1个回答
2
投票

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变量。

文档:fopen_fileno_get_osfhandleSetHandleInformation

© www.soinside.com 2019 - 2024. All rights reserved.