c++ - Windows——在子进程中继承控制台文件句柄

标签 c++ c windows winapi win32-process

我有一个 Windows 应用程序(subsystem=windows,不是控制台应用程序)。我正在该应用程序中创建一个控制台,然后创建一个子进程。当我创建控制台时,我使控制台文件句柄可继承(见下文)。创建子进程时,我将 CreateProcess 的 bInheritHandles 参数设置为 TRUE。我希望子进程能够从控制台读取和写入,但出现错误 0x06无效句柄

我执行以下操作:

1) AllocConsole();

2) CreateFile("CONIN$", ...), CreateFile("CONOUT$", ...)CreateConsoleScreenBuffer(...) 与以下 SetConsoleActiveScreenBuffer(...)。始终使用 SecurityAttributesbInheritHandle=TRUE。 但请参阅bInheritHandle=1

3) CreateProcess(NULL, GetCommandLine(), NULL, NULL, TRUE,/* 继承句柄 */0, NULL, NULL, &sinfo, &child);

在子进程中:

1) _open_osfhandle((intptr_t)console_handle, 0) 给我 -1 并且 GetLastError() 返回错误 0x06 -- “无效句柄”

子进程是其父进程的拷贝,因此两个进程具有相同的子系统:windows(不是控制台应用程序)。

我已检查其他文件句柄是否正常继承,并且可以与 fdopen(_open_osfhandle(file_handle), ...) 一起使用。例如,它适用于文本文件。但它不适用于控制台句柄。

我做错了什么?

最佳答案

是的,arx(参见上面的评论)绝对正确:控制台文件句柄是“假”句柄,因为它在操作系统级别不存在(并且不能继承)。这种类型的文件句柄仅对于 Win32 api 库 (kernel32.dll) 和仅在此级别处理的 I/O 请求是已知的。 Windows 没有真正的控制台文件,就像 Unix 中的虚拟终端(Windows8 除外)。 :-( 所以,我需要将应用程序的子系统从“windows”类型更改为“console”,然后应用程序可以使用预先分配的控制台(但文件句柄仍然无法继承 - 需要重新打开“CONOUT$”在子进程中...)

关于c++ - Windows——在子进程中继承控制台文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947362/

相关文章:

c++ - 定义需要在运行时设置的 const static

python - 使用 Python3 C API 覆盖对象方法

c - 在 Delphi/C 中更快地传递参数

c - C语言中如何对数组设置至少一个元素必须是特定整数的条件?

c++ - 在 ATL 项目中将 NULL 指针传递给进程外 COM 方法的正确方法

python - 在 Windows 中使用资源

c++ - 隐式转换和用户定义的转换

C++ win客户端发送linux服务器变量

c++ - OOP C++、虚函数和新运算符

java - 如何终止通常使用 ProcessBuilder 创建的进程