Windows Closehandle()未终止进程

Windows Closehandle()未终止进程,windows,winapi,process,msdn,Windows,Winapi,Process,Msdn,在Closehandle()中关闭其句柄后,进程不会终止 我有一个由Createprocess()api创建的进程。即使关闭其句柄,它仍在运行 在msdn中,他们说closehandle关闭句柄,不终止进程。必须为此调用终止线程。那为什么是Closehandle() 但当我检查closehandle的返回值时,它成功了。如果是这样,我想知道在这个closehandle()中实际做了什么,以及为什么它会成功返回。我想知道,在这个进程上,所有的操作都可以通过它的句柄来完成。我感到有误导性,因为clo

在Closehandle()中关闭其句柄后,进程不会终止

我有一个由Createprocess()api创建的进程。即使关闭其句柄,它仍在运行

在msdn中,他们说closehandle关闭句柄,不终止进程。必须为此调用终止线程。那为什么是Closehandle()

但当我检查closehandle的返回值时,它成功了。如果是这样,我想知道在这个closehandle()中实际做了什么,以及为什么它会成功返回。我想知道,在这个进程上,所有的操作都可以通过它的句柄来完成。我感到有误导性,因为closehandle()成功了,但进程仍在运行


进程句柄中实际包含的内容也很好,与其他类型的句柄(文件、I/O等)有什么区别吗。进程自行运行时,可能会打开零个或多个句柄,这些句柄允许其持有者以某种方式控制进程。一旦你握住把手,你就有责任关闭它


流程的终止是另一回事,您基本上不需要在外部终止:您永远不知道您在哪里停止流程。您需要以某种方式发出信号,表示希望进程终止,以便进程能够找到它并在内部优雅地终止其活动。

句柄是对某个内核管理的引用计数对象的引用。通常,关闭对象的最后一个句柄将导致此类对象的销毁

但是:关闭最后一个句柄时不会终止进程和线程,您可以认为它们在启动后“开始独立生活”。如果没有这个例外,您就不能让一个进程比其父进程长寿,因为每个进程的句柄都会在进程终止时自动关闭(而让一个线程比其父进程长寿将需要不必要的复杂性)

无论如何,所有这些都有文档记录:如果您阅读

关闭线程句柄不会终止关联的线程或进程 移除线程对象。关闭进程句柄不会终止 关联的进程或删除进程对象。除去 线程对象,则必须终止线程,然后关闭所有句柄 到线程。有关详细信息,请参见终止线程。到 如果要删除流程对象,则必须终止流程,然后关闭 进程的所有句柄。有关详细信息,请参见终止 过程

为什么关闭句柄不会终止进程?必须为此调用
TerminateProcess
。 关闭句柄不会终止进程,因为这样做很荒谬。进程通常彼此独立运行。如果关闭进程句柄终止了相应的进程,则情况不会如此,因为当程序退出时,它持有的所有打开的句柄都将关闭。例如,这意味着如果Explorer崩溃,您启动的每个程序都会立即终止。这将是一个desaster,因此关闭进程句柄并不会终止程序

终止进程几乎总是一个非常糟糕的主意。终止线程也是如此。如果可以避免的话,千万不要那样做。如果希望某个线程/进程退出,请向它发送一条消息,并等待它退出(代表它自己)。这可以确保数据正确保存并处于一致状态,不会泄漏任何资源,也不会发生严重冲突(例如线程在持有锁时被终止)。
终止线程通常很麻烦,有时甚至是灾难性的。终止进程也是如此。只有当进程或线程陷入无限循环且无响应时,才“允许”终止它

那你为什么要关上把手,如果你必须关上它,为什么你会得到一个呢? 您可以使用句柄执行某些操作,例如
ReadProcessMemory
WriteProcessMemory
CancelIoEx
、运行调试器、使用PSAPI以及其他一些操作。您也可以等待句柄,当进程退出时,它将发出信号。这是进程间同步的一种非常简单的方法。
另一方面,只要您保持句柄打开,操作系统就无法释放资源,从而拥有访问这些资源的“合法权利”。例如,如果流程(或至少其结构)根本不存在,您如何等待流程

这(以及句柄本身是一个资源的事实)就是为什么如果不需要它,应该尽快关闭句柄的原因。无限期保留它需要操作系统保留不需要但无法释放的资源。
关闭句柄会告诉操作系统您不再需要它了,因此无论何时操作系统想要释放与进程相关的所有资源,它都可以这样做

进程句柄中包含什么?
与所有句柄一样,进程句柄只是一个不包含任何内容的不透明整数。它是内核拥有的表中的一个索引,从技术上讲是一个
void*
,但这只是一个实现细节。它所指的实际内核结构不是您可以直接访问的,无论如何也不是一种简单的方式。

类似地,关闭文件句柄并不会删除文件。