【问题标题】:CreateProcess handlingCreateProcess 处理
【发布时间】:2013-04-17 22:06:46
【问题描述】:

我使用 Windows API CreateProcess 函数。在它的msdn手册中,我发现了

如果函数成功,请务必在完成后调用 CloseHandle 函数来关闭 hProcess 和 hThread 句柄。否则,当子进程退出时,系统无法为子进程清理进程结构,因为父进程仍有打开子进程的句柄。

那么我应该在哪里做呢?

情况是进程开始了,没有他的生活轨迹。它是否强制我创建一个线程,将在其中创建进程,然后线程将等待使用,例如WaitForSingleObject,直到进程死亡,因此可以释放句柄?

【问题讨论】:

  • 否 - 如果函数返回成功,只需立即关闭句柄并继续您愉快的方式。
  • 如果你要保持“跟踪他的生活”,那么你需要保持手柄直到你完成跟踪。一定要避免在这个线程上烧毁,RegisterWaitForSingleObject() 可以让这个更便宜。

标签: c++ windows


【解决方案1】:

您不必等待子进程完成,您只需在不再需要句柄时CloseHandle

这样做的原因是,即使在进程完成后,您也可能希望保留进程的句柄。例如,您可能想要检查其返回状态。只要你有句柄,Windows 就无法在它之后进行清理。

但是,如果您不再关心孩子做什么,请关闭把手并继续前进。

如果您在乎,请致电WaitForSingleObject 并提供您从CreateProcess 获得的句柄。或者调用RegisterWaitForSingleObject(再次将进程句柄传递给它)使用一个回调函数,该函数将在进程结束时调用。

【讨论】:

  • 如果我想尽快将进程返回值保存到某个变量中,我应该怎么做?有没有事件系统?
  • 事件是句柄本身。进程句柄上的WaitForSingleObject 将在进程退出时完成。如果不想烧线程,可以使用RegisterWaitForSingleObject,当句柄有信号时得到通知。
  • 已更新以涵盖您确实想等待的情况。
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多