控制由 C++ std::fstream 在 Windows 中创建的文件句柄的继承性
Controlling inheritability of file handles created by C++ std::fstream in Windows
在 Windows 中,当使用 CreateProcess
创建进程时,可以将 true
作为 bInheritHandles
参数传递。
CreateProcess( , , , , bInheritHandles, , , , )
这意味着所有标记为可继承的文件句柄实际上将由子进程继承。
如何控制C++创建的底层文件句柄std::fstream
class是否可继承?
C 运行时默认创建可继承句柄。
ofstream outFile("filename.txt") ;
CreateProcess("program.exe", ..., true, ...) ; //program.exe will inherit the above file handle
所以,如果你想让句柄被继承,你不需要做任何事情。
如果您不想继承句柄,则必须使用 WinAPI 函数 SetHandleInformation
自行设置句柄的 HANDLE_FLAG_INHERIT
标志,如下所示:
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
打开文件,您可以在 fopen
参数中指定 Windows 特定的 "N"
模式,使句柄不可继承.
示例:
#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
在 Windows 中,当使用 CreateProcess
创建进程时,可以将 true
作为 bInheritHandles
参数传递。
CreateProcess( , , , , bInheritHandles, , , , )
这意味着所有标记为可继承的文件句柄实际上将由子进程继承。
如何控制C++创建的底层文件句柄std::fstream
class是否可继承?
C 运行时默认创建可继承句柄。
ofstream outFile("filename.txt") ;
CreateProcess("program.exe", ..., true, ...) ; //program.exe will inherit the above file handle
所以,如果你想让句柄被继承,你不需要做任何事情。
如果您不想继承句柄,则必须使用 WinAPI 函数 SetHandleInformation
自行设置句柄的 HANDLE_FLAG_INHERIT
标志,如下所示:
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
打开文件,您可以在 fopen
参数中指定 Windows 特定的 "N"
模式,使句柄不可继承.
示例:
#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