Управление наследуемостью файловых дескрипторов, созданных C ++ std :: fstream в Windows - PullRequest
2 голосов
/ 04 апреля 2019

В Windows при создании процесса с CreateProcess можно передать true в качестве аргумента bInheritHandles.

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

Это означает, что все файловые дескрипторы, помеченные как наследуемые, действительно будут наследоваться дочерним процессом.

Как мы можем контролировать, является ли основной дескриптор файла, созданный классом C ++ std::fstream, наследуемым или нет?

1 Ответ

2 голосов
/ 04 апреля 2019

Среда выполнения C создает наследуемые дескрипторы по умолчанию.

ofstream outFile("filename.txt") ;
CreateProcess("program.exe", ..., true, ...) ; //program.exe will inherit the above file handle

Итак, если вы хотите, чтобы дескриптор был унаследован, вам не нужно ничего делать.

Если вы ДЕЛАЕТЕНЕ хотите, чтобы дескриптор был унаследован, вы должны сами установить флаг HANDLE_FLAG_INHERIT дескриптора, используя функцию WinAPI 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_osfhandle , SetHandleInformation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...