如果流程是从Windows上的其他流程生成的,我可以关闭流程自己的句柄吗?

时间:2015-12-02 16:43:13

标签: c++ winapi handle

我有一个调用函数CreateProcess()的进程,但是我从不从父进程调用CloseHandle(),因为我不知道用户什么时候会退出子进程。这会导致某种泄漏还是没问题,因为当子进程关闭时,它会释放所有资源?

3 个答案:

答案 0 :(得分:6)

如果您没有关闭手柄,则会有手柄泄漏。

你应该保留句柄,只要你需要把它传递给另一个WinAPI函数,例如,如果你需要有关过程的信息,比如a)它是否终止,b)什么是返回值,c)多少它消耗的处理器时间。您可以在不再需要时关闭手柄。关闭句柄不会关闭子进程,它仍将继续运行!

您可以在备注部分找到有关PROCESS_INFORMATION structure对MSDN影响的更多信息。另请注意,您需要CloseHandle线程句柄。

答案 1 :(得分:1)

问题和评论引用了几句:

  

我从不从父进程调用CloseHandle(),因为我不知道用户何时会退出子进程。

  

产生进程的线程继续执行其他操作,并且在子进程关闭后预计会持续很长时间。所以我还不能关闭它?

我认为这是你的根本误解。句柄只是您与进程或线程对象交互的手段。关闭句柄不会终止对象。它只是整理手柄周围的资源。对象,进程或线程在您的句柄关闭后继续存在。

如果您需要终止该过程,请致电TerminateProcess传递您的流程句柄。此时,您通常可以安全地关闭手柄。

以下是您需要遵循的规则:

  1. 只要您需要使用它们,就需要保持进程和线程句柄处于打开状态。因此,如果您需要等待进程或线程,则需要对象的句柄。一旦不再需要引用对象,就可以关闭手柄。
  2. 如果未关闭句柄,则在创建句柄的进程终止时将关闭该句柄。对于正在考虑的示例,这意味着父进程终止时。系统会在终止时清除进程拥有的所有资源。有时这是一种合理的方法。通常,如果您需要直接引用对象直到进程终止,那么这是有意义的。
  3. 如果您反复创建进程,并且不关闭句柄,那么这可能是资源泄漏。显然你不想泄漏资源。

答案 2 :(得分:0)

您可以关闭该流程的句柄。除非您致电TerminateProcess,或者通过其他方法关闭,否则该流程将继续存在。

如果您不需要处理,请拨打CloseHandle,并且您希望尽快执行此操作。 仍然拥有该进程的句柄将导致资源泄漏。虽然在流程终止时将删除流程及其资源,但除非您关闭该句柄,否则其中某些信息仍将继续存在。