gpt4 book ai didi

windows - 使用属于已终止进程的进程句柄是否安全

转载 作者:行者123 更新时间:2023-12-02 01:24:37 24 4
gpt4 key购买 nike

我正在用 C++ 开发 Windows 控制台应用程序。我需要我的程序对另一个我无法控制的进程执行一些操作。

但是,我对目标进程可能因某种原因(通过任务管理器等)终止的情况有一些疑问。使用已经终止的进程的句柄是否安全?

注意:如果其中一个功能失败,我会停止操作。

HANDLE hProcess = OpenProcess(pid);
if( hProcess != NULL )
{
// Lets suppose process is terminated here

/* Some operations on process using returned handle*/
}

最佳答案

Kernel objects在 Windows 中是引用计数的,引用表示为 handles to objects 。客户端代码可以创建内核对象并接收初始引用(例如 CreateProcess ),增加现有对象的引用计数(例如 OpenProcessDuplicateHandle ),并减少引用计数( CloseHandle )。只要您持有 HANDLE,该 HANDLE 引用的对象就会保持事件状态。

如果是process对象,至少只要您持有对它的引用 (HANDLE),该对象就有效。进程已终止的事实是可以观察到的,但如果存在任何未完成的引用,则不会以其他方式使进程对象无效或销毁。

具体来说,这意味着您可以执行对“实时”进程(操作系统仍在调度线程执行的进程)执行的任何操作,例如 WaitForSingleObject 。另外您可以调用GetExitCodeProcess并且该调用不会返回 STILL_ACTIVE

除非调用CloseHandle,您现在是对流程对象的消亡拥有发言权的利益相关者。除非您签字,否则它不会消失。由此推论,您现在还可以控制 PID 的有效性。它与进程的生命周期相关,只要您通过 HANDLE 保存对它的引用,该 PID 就不会被另一个进程重用。

总之,只要你捕获一个(进程)HANDLE,你就可以做任何事情。

关于windows - 使用属于已终止进程的进程句柄是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75083746/

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