【问题标题】:Windows -- inherit console file handle in child processWindows -- 在子进程中继承控制台文件句柄
【发布时间】:2014-11-15 15:24:01
【问题描述】:

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

我执行以下操作:

1) AllocConsole();

2) CreateFile("CONIN$", ...)CreateFile("CONOUT$", ...)CreateConsoleScreenBuffer(...) 与以下 SetConsoleActiveScreenBuffer(...)。始终拥有SecurityAttributesbInheritHandle=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) 给我-1GetLastError() 返回错误0x06 -- "Invalid handle"

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

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

我做错了什么?

【问题讨论】:

  • 不清楚您在第 2 步中在做什么,或者子进程从何处获取 console_handle 的值。请显示一些实际代码。
  • 控制台句柄是指当前进程的控制台的伪句柄。如果子进程是一个 Windows 应用程序,那么当您启动它时它不会有控制台,因此引用当前控制台的句柄是没有意义的。
  • 你在父编中调用SetStdHandle() 吗?并看到这个继承子gui中的控制台hg.netbeans.org/main-golden/file/2da7b1f9de9b/o.n.bootstrap/…

标签: c++ c windows winapi win32-process


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2018-05-22
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多