我正在用C++开发一个Windows控制台应用程序。我需要我的程序在另一个我没有任何控制权的进程上做一些操作。
但是,我有一些怀疑的情况下,目标进程可能会被终止的一些原因(由任务管理器等)。它是安全的使用句柄的进程已经终止?
- 注意:如果其中一个功能失败,我将停止操作。*
HANDLE hProcess = OpenProcess(pid);
if( hProcess != NULL )
{
// Lets suppose process is terminated here
/* Some operations on process using returned handle*/
}
1条答案
按热度按时间w46czmvw1#
Windows中的Kernel objects是引用计数的,引用表示为handles to objects。客户端代码可以创建内核对象并接收初始引用(例如
CreateProcess
),递增现有对象上的引用计数(例如OpenProcess
或DuplicateHandle
),并递减引用计数(CloseHandle
)。只要您保留HANDLE
,该HANDLE
引用的对象就保持活动状态。对于process对象,只要你持有对它的引用(
HANDLE
),该对象就有效。进程已经终止的事实是可以观察到的,但是如果有任何对它的未完成引用,则不会使进程对象无效或破坏进程对象。具体来说,这意味着你可以用一个“实时”进程(操作系统仍然在为它调度线程)执行任何操作,比如
WaitForSingleObject
,另外你可以调用GetExitCodeProcess
,而那个调用不会返回STILL_ACTIVE
。禁止调用
CloseHandle
,您现在是一个利益相关者,对进程对象的消亡有发言权。除非您签署它,否则它不会消失。这样做的一个必然结果是,您现在还控制PID的有效性。它与进程的生命周期相关联,只要您通过HANDLE
持有对它的引用,该PID就不会被另一个进程重用。总之,只要你坚持一个(进程)
HANDLE
,你就可以做任何事情。