【问题标题】:Effect of PROC_THREAD_ATTRIBUTE_HANDLE_LIST on child process standard input, standard output, standard error, relationship to STARTF_USESTDHANDLESPROC_THREAD_ATTRIBUTE_HANDLE_LIST对子进程标准输入、标准输出、标准错误、与STARTF_USESTDHANDLES的关系的影响
【发布时间】:2021-03-25 14:38:30
【问题描述】:

我一直在尝试使用 Windows API 来启动通过匿名管道与父进程通信的子进程。基本思想是使用CreatePipe 在父进程中创建一个或多个管道,然后使用CreateProcessSTARTUPINFOEX 参数启动具有继承管道句柄的子进程,该参数指定PROC_THREAD_ATTRIBUTE_HANDLE_LIST 属性中的继承句柄.

在我看来,句柄列表的第一个元素用作子进程的标准输入,第二个用作标准输出,第三个用作标准错误。我没有看到任何关于这种行为的文档,我没想到它是因为STARTUPINFO 字段hStdInputhStdOutputhStdError(以及dwFlags 中的STARTF_USESTDHANDLES 标志)似乎特别旨在传达CreateProcess 调用者关于标准句柄的意图。从实验上看,PROC_THREAD_ATTRIBUTE_HANDLE_LIST 似乎覆盖了STARTF_USESTDHANDLES,我觉得这更令人惊讶。

那么两个问题:

  1. 此行为是否记录在我遗漏的某处?
  2. 如何在继承句柄的同时使用默认行为来确定子进程的标准句柄?

更新:事实证明,我看到的行为特定于我作为子进程启动的应用程序。它一定是在检查继承的句柄并对它们执行特定的命令。大多数 Windows 应用程序的行为并非如此。

【问题讨论】:

  • 没有这样的行为。你错了。传递给PROC_THREAD_ATTRIBUTE_HANDLE_LIST 的数组中句柄的顺序没有任何作用
  • @RbMm 感谢您的回复。原来我看到的行为是由于我作为子进程启动的特定应用程序,而不是 Windows API。如果您想提交您的评论作为答案,我会将其标记为正确。

标签: windows winapi


【解决方案1】:

PROC_THREAD_ATTRIBUTE_HANDLE_LIST扩展属性用于明确指定特定进程继承哪些句柄。

Raymond Chen's blog 提供更多详细信息,

但是所有这些可继承性的摆弄仍然有一个致命的缺陷:如果 同一进程中的两个线程都调用 CreateProcess 但 不同意他们想要继承哪些句柄?例如, 假设你有一个函数 CreateProcessWithSharedMemory 工作是启动一个进程,传递给它一个定制的共享内存 堵塞。假设两个线程同时运行这个函数。

...

Windows Vista 通过允许您传递 您希望 bInheritHandles 参数的句柄的显式列表 适用于。 (如果你传递一个显式列表,那么你必须传递 TRUE bInheritHandles。)和以前一样,对于要继承的句柄,它 也必须标记为可继承。

并且博客给出了详细的代码示例和实现方法。

父子进程之间的匿名通信,请参考:

PROC_THREAD_ATTRIBUTE_HANDLE_LIST 覆盖 STARTF_USESTDHANDLES,它不会产生任何影响。相反,子进程不会继承父进程的句柄。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2018-08-29
    • 2014-07-22
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多