gpt4 book ai didi

windows - Closehandle() 不终止进程

转载 作者:可可西里 更新时间:2023-11-01 09:39:54 28 4
gpt4 key购买 nike

CloseHandle() 中关闭其句柄后,进程未终止。

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

在 msdn 中,他们说 CloseHandle() 关闭句柄并且不会终止进程。必须为此调用终止线程。那为什么要CloseHandle()呢?

但是当我检查CloseHandle() 的返回值时,它成功了。如果是这样,我想知道在这个 CloseHandle() 中实际做了什么以及它为什么成功返回。我想知道使用它的句柄可以在进程上完成哪些所有操作。我觉得误导了,因为 CloseHandle() 成功了,但进程仍在继续!

进程句柄中实际包含的内容也很棒,与其他类型的句柄有什么区别吗? (文件、I/O 等)

最佳答案

为什么关闭句柄并没有终止进程?为此必须调用 TerminateProcess

关闭句柄并不会终止进程,因为这很荒谬。进程通常彼此独立运行。如果关闭进程句柄终止了相应的进程,情况就不会是这样,因为当程序退出时,它持有的所有打开的句柄都会关闭。例如,这意味着如果资源管理器崩溃,您启动的每个程序 将立即终止。那将是一场灾难,因此关闭进程句柄在设计上不会终止程序。

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

那为什么你无论如何都要关闭 handle ,如果你必须关闭它,你为什么还要一个?

您可以使用句柄做某些事情,例如 ReadProcessMemoryWriteProcessMemoryCancelIoEx、运行调试器、使用 PSAPI , 和其他一些。您也可以等待句柄,当进程退出时会发出信号。这是一种非常简单的进程间同步方式。
另一方面,操作系统不能释放资源,只要你保持句柄打开,从而拥有访问这些资源的“合法权利”。例如,如果进程(或至少其结构)根本不存在,您如何等待进程?

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

进程句柄中包含什么?

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

关于windows - Closehandle() 不终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834685/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com