如果某个进程是从 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
并传递您的进程句柄。到那时,您通常可以安全地关闭手柄。
以下是您需要遵守的规则:
- 只要您需要使用进程和线程句柄,您就需要将它们保持打开状态。因此,如果您需要等待进程或线程,则需要对象的句柄。一旦您不再需要引用该对象,您就可以关闭句柄。
- 如果您不关闭句柄,它会在创建句柄的进程终止时关闭。对于正在考虑的示例,这意味着父进程终止的时间。系统会在终止时清除进程拥有的所有资源。有时这是一种合理的方法。通常,如果您需要在进程终止之前一直引用该对象,那么这很有意义。
- 如果您重复创建进程,并且不关闭句柄,则这可能是资源泄漏。显然你不想泄漏资源。
我有一个调用函数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
并传递您的进程句柄。到那时,您通常可以安全地关闭手柄。
以下是您需要遵守的规则:
- 只要您需要使用进程和线程句柄,您就需要将它们保持打开状态。因此,如果您需要等待进程或线程,则需要对象的句柄。一旦您不再需要引用该对象,您就可以关闭句柄。
- 如果您不关闭句柄,它会在创建句柄的进程终止时关闭。对于正在考虑的示例,这意味着父进程终止的时间。系统会在终止时清除进程拥有的所有资源。有时这是一种合理的方法。通常,如果您需要在进程终止之前一直引用该对象,那么这很有意义。
- 如果您重复创建进程,并且不关闭句柄,则这可能是资源泄漏。显然你不想泄漏资源。