C++ 控制由C++;Windows中的std::fstream
在Windows中,使用创建进程时,可以将C++ 控制由C++;Windows中的std::fstream,c++,winapi,fstream,child-process,filehandle,C++,Winapi,Fstream,Child Process,Filehandle,在Windows中,使用创建进程时,可以将true作为bInheritHandles参数传递 CreateProcess( , , , , bInheritHandles, , , , ) 这意味着所有标记为可继承的文件句柄实际上都将由子进程继承 我们如何控制由C++ STD::fStuts类创建的底层文件句柄是否可继承?< P> C运行时默认创建可继承的句柄。 ofstream outFile("filename.txt") ; CreateProcess("program.exe", .
true
作为bInheritHandles
参数传递
CreateProcess( , , , , bInheritHandles, , , , )
这意味着所有标记为可继承的文件句柄实际上都将由子进程继承
我们如何控制由C++ <代码> STD::fStuts类创建的底层文件句柄是否可继承?
< P> C运行时默认创建可继承的句柄。ofstream outFile("filename.txt") ;
CreateProcess("program.exe", ..., true, ...) ; //program.exe will inherit the above file handle
因此,如果希望继承句柄,则无需执行任何操作
如果不希望继承句柄,则必须使用WinAPI函数设置句柄的handle\u标志\u INHERIT
标志,如下所示:
FILE* filePtr = fopen("filename.txt", "w") ;
SetHandleInformation( (HANDLE)_get_osfhandle(_fileno(filePtr)), HANDLE_FLAG_INHERIT, 0) ;
ofstream outFile(filePtr) ;
在上面的第三行中,stream(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;
}
#包括
#包括
内部主(空){
FILE*fp=fopen(“SomeFile.txt”、“rwN”);
如果(!fp){
返回-1;
}
系统(“SomeProcess.exe”);
fclose(fp);
返回0;
}
资料来源:
你不能。如果您计划继承,请使用CreateFile()。但是,至少如果使用MSVC,有一种方法可以首先从句柄获取文件*,然后将std::fstream绑定到该文件*。为什么要这么麻烦呢。因为您必须使用API,所以只使用API,而不同时使用API和std.@MichaelChourdakis,fstream
对象更易于使用。通过使用运算符
可以自动解析和字符串化变量。@Mercalli与API相比,所有std对象的功能都受到限制,仅对基本处理级别有用。在全高项目中,您需要更多的功能,这意味着API。此外,您仍然可以使用缓冲区级别的流函数,然后使用API将缓冲区写入文件。或者,您可以将不应继承的所有句柄(以及可能丢失的超出您控制范围的OS或库句柄)“黑名单”改为白名单,具体列出您希望继承的这些句柄。