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

İsa*_*gül 2 windows winapi process

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

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

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

HANDLE hProcess = OpenProcess(pid);
if( hProcess != NULL )
{
    // Lets suppose process is terminated here
    
    /* Some operations on process using returned handle*/
}
Run Code Online (Sandbox Code Playgroud)

IIn*_*ble 5

Windows 中的内核对象是引用计数的,引用表示为对象的句柄。客户端代码可以创建内核对象并接收初始引用(例如CreateProcess),增加现有对象的引用计数(例如OpenProcess, 或DuplicateHandle),并减少引用计数(CloseHandle)。只要您保留 a HANDLE,该对象引用的对象HANDLE就会保持活动状态。

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

具体来说,这意味着您可以执行对“实时”进程(操作系统仍在调度线程执行的进程)执行的任何操作,例如WaitForSingleObject. 此外,您可以拨打电话GetExitCodeProcess,但该电话不会返回STILL_ACTIVE

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

总而言之,只要你坚持一个(过程),HANDLE你就可以做任何事。