Windows -- 继承子进程中的控制台文件句柄
Windows -- inherit console file handle in child process
我有一个Windows应用程序(subsystem=windows
,而不是控制台应用程序)。我正在该应用程序中创建一个控制台,然后创建一个子进程。创建控制台时,我使控制台文件句柄可继承(见下文)。创建子进程时,我将 CreateProcess
的bInheritHandles
参数设置为 TRUE
。我希望子进程能够从控制台读取和写入,但是我收到错误0x06
,invalid handle
。
我执行以下操作:
1) AllocConsole();
2) CreateFile("CONIN$", ...)
、CreateFile("CONOUT$", ...)
或 CreateConsoleScreenBuffer(...)
以下SetConsoleActiveScreenBuffer(...)
。总是SecurityAttributes
bInheritHandle=TRUE
.但请参阅bInheritHandle=1
.
3) CreateProcess(NULL, GetCommandLine(), NULL, NULL,
TRUE, /* inherit handles */ 0, NULL, NULL, &sinfo, &child);
在子进程中:
1)_open_osfhandle((intptr_t)console_handle, 0)
给了我-1
,GetLastError()
返回错误0x06
- "Invalid handle"
。
是其父进程的副本,因此两个进程具有相同的子系统:windows
(不是控制台应用程序)。
我已经检查了其他文件句柄是否正常继承并且可以与fdopen(_open_osfhandle(file_handle), ...)
一起使用。例如,它适用于文本文件。但它不适用于控制台句柄。
我做错了什么?
是的,arx(见上面的评论)绝对正确:控制台文件句柄是"假"句柄,因为它在操作系统级别不存在(并且不能继承)。这种类型的文件句柄仅适用于 Win32 API 库 (kernel32.dll) 和仅在此级别处理的 I/O 请求。Windows没有真正的控制台文件,作为Unix中的虚拟终端(Windows8除外)。:-( 所以,我需要将我的应用程序的子系统从"windows"类型更改为"控制台",然后应用程序可以使用预分配的控制台(但文件句柄仍然无法继承 - 需要在子进程中重新打开"CONOUT$"......
- 确定文件句柄是否为管道句柄
- 如何从文件句柄获取包含目录的句柄
- 将C文件句柄分配给C 文件流
- 调用posix_spawn时关闭所有文件句柄
- 保持潜在的文件句柄
- 在先前关闭的文件句柄上的 fclose() 上出现双重释放错误
- 正在从内存中获取文件句柄
- HANDLE(IntPtr)已过时,kernel32.dll,安全文件句柄到IntPtr
- JNI 问题:DLL 中的文件句柄出现符号查找错误C++
- 有没有办法使用一个文件句柄将手表放在千个目录上
- 将文件句柄重定向到字符缓冲区
- SQLite:在 WAL 模式下持久化文件句柄
- Windows -- 继承子进程中的控制台文件句柄
- 如何获取进程的文件句柄
- 关闭提前退出的程序的文件句柄时的Linux 3.14策略
- c++ boost asio Windows文件句柄async_read_until无限循环-没有eof.< /
- 查找当前打开的文件句柄数(不是lsof)
- 使用FindFile和文件句柄的c++内存泄漏
- 获取现有的文件句柄
- 如何根据要写入的数据类型动态选择文件句柄