【问题标题】:On Windows do I *have to* call WaitForSingleObject() after calling CreateProcess()?在 Windows 上,我是否必须在调用 CreateProcess() 后调用 WaitForSingleObject()?
【发布时间】:2021-12-13 13:52:51
【问题描述】:

在Linux上,我必须在父进程上的fork()之后调用wait(),否则子进程在完成后将保持僵尸状态,直到父进程完成。

我想知道我是否必须在 Windows 上遵循类似的步骤, 即我是否必须在拨打WaitForSingleObject()之后拨打CreateProcess()

我知道 Windows 的 CreateProcess() 与 Linux 的 fork() 不同,而且似乎“僵尸”是 Windows 上不存在的 UNIX/Linux 概念。但也许我仍然必须调用WaitForSingleObject() 来释放分配给CreateProcess() 的一些操作系统资源,类似于Linux 的情况。

【问题讨论】:

  • 更等效的 Windows C 调用将是 _beginthread()CreateProcess() 启动一个独立的进程。
  • 来自CreateProcess()的新窗口进程有自己的生命。父进程如果想监控子生命,可以调用WaitForSingleObject()
  • 不,你不能等待
  • fork() 也创建了一个单独的进程
  • @Alexander - 我不知道这里需要哪个参考。但在 indows 进程中独立于它的父进程。如果愿意,您可以等待,但不能等待。

标签: c linux windows operating-system


【解决方案1】:

如果CreateProcess成功,你必须关闭PROCESS_INFORMATION中的两个句柄,但你不必先等待子进程,如果你不需要它们,可以随时关闭句柄。

进程的打开句柄将使进程对象在完成运行后保持在僵尸状态。

【讨论】:

  • 感谢您的回答。为了完整起见,您是否有任何证明链接或任何理由说明为什么在 Windows 上不需要它,即为什么它只足以关闭句柄?
  • @Alexander if CreateProcess __required __to use WaitHandle after, 那么它会写在CreateProcess的文档中。
  • 我没有可以链接到的任何 Microsoft 文档,但理由是这正是内核处理在 Windows 上的工作方式。当你完成它们时关闭它们而不关心对象的状态。如果你碰巧关闭了最后一个打开的句柄,那么内核将处理清理。
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多