【问题标题】:How can I wait for the child process to be really started如何等待子进程真正启动
【发布时间】:2013-12-31 23:21:57
【问题描述】:

如何等待通过 CreateProcess 函数运行的子进程真正启动?我想的是 WaitForInputIdle 函数,但它比子应用程序绘制所有窗口更早返回。

【问题讨论】:

  • 你有子进程的源码吗?如果你这样做了,也许可以使用命名事件在进程之间发出信号。
  • 或者使用condition variable
  • 是什么原因? WaitForInputIdle 是一个很好的功能,因为消息处理开始......如果程序启动,则最小化 d 子窗口将永远不会被绘制。它有什么不同吗?告诉我们原因...
  • @Roger Rowland 不,我没有子进程的源代码
  • 为什么需要让父窗口等待子窗口完全绘制?一旦孩子运行,父母实际上对孩子做了什么?你可能在等待错误的事情。

标签: c++ c windows winapi


【解决方案1】:

解决此问题的方法是,您在父级中创建一个管道。在分叉之后,父节点从管道中读取数据,子节点写入一些数据以表示它已准备好继续。

【讨论】:

  • 一个Event对象就够了!
  • 当然,任一解决方案都假定您拥有子进程的源代码,并且可以向其添加这样的通知。
  • @RemyLebeau,这些信息在原始问题中会很有用。
【解决方案2】:

如果您有子进程的代码,那么一种方法是在父进程中创建一个命名事件并等待该事件。在子进程中,您打开事件并在子进程确定它真正开始时发出信号。

如果您要生成大量进程,那么您需要为事件命名约定,以便每个父/子对都有自己的事件。一种解决方案是使用 GUID 命名事件,然后将该 GUID 传递到其命令行上的子进程。

【讨论】:

  • 仅供参考,(我知道您没有源访问权限,但是...)您不想使用命名事件(存在安全问题、唯一命名等)。创建一个未命名的事件,将 SECURITY_ATTRIBUTES 传递给 CreateEvent() 并指定 bInheritHandle=TRUE。然后,在创建子进程时,您通过 cmdline args 告诉它句柄(想想:sprintf(buf, "%p", handle);),子进程可以抓住它并向您发出信号。另请参见 DuplicateHandle()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
相关资源
最近更新 更多