如果某个进程是从 Windows 上的另一个进程生成的,我可以关闭它自己的句柄吗?

Can I close a process's own handle if it's been spawned from another process on Windows?

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

如果不关闭句柄,则句柄泄漏。

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

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

您可以关闭该进程的句柄。除非你调用 TerminateProcess,或者它被其他方法关闭,否则该进程将继续存在。

如果您不需要处理,请致电 CloseHandle,您最好尽快处理。 仍然拥有进程的句柄将导致资源泄漏。虽然进程终止时进程及其资源将被删除,但它的一些信息仍将继续存在,除非您关闭该句柄。

问题和评论中的一些引述:

I never call CloseHandle() from the parent process, because I don't know when the user would exit the child process.

并且:

The thread that spawns the process continues to do other things afterwards and is expected to continue long after the child process closes. So I can't close it just yet?

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

如果您需要终止进程,请调用 TerminateProcess 并传递您的进程句柄。到那时,您通常可以安全地关闭手柄。

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

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