Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/169.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 控制由C++;Windows中的std::fstream_C++_Winapi_Fstream_Child Process_Filehandle - Fatal编程技术网

C++ 控制由C++;Windows中的std::fstream

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", .

在Windows中,使用创建进程时,可以将
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或库句柄)“黑名单”改为白名单,具体列出您希望继承的这些句柄。