不知道有沒有哪位用windows API TerminateProcess 將其他行程殺死后,仍然可以用OpenProcess獲取到這個行程的句柄,查看了下任務管理器,被殺死行程的ID確實不在里面,有沒有更合理的解釋?
uj5u.com熱心網友回復:
這個取決于那一瞬間系統是否清理了行程資訊等,需要看內核是否原子操作等uj5u.com熱心網友回復:
每秒心跳檢測這個行程是否存在,發現OpenProces還是能夠打開這個已經被關閉的行程
uj5u.com熱心網友回復:
那就是系統還沒有回收。或者這個句柄是否分配給其他行程了uj5u.com熱心網友回復:
TerminateProcess之后,WaitForSingleObject(PROCESS_HANDLE, INFINITE);uj5u.com熱心網友回復:
系統沒有回收,但在任務管理器里也沒有找到這個行程ID,所以在想這個行程是不是被徹底回收掉了,有沒有什么思路提供?MSDN的解釋是如果這個行程有IO操作,會在IO操作完成后再由內核進行徹底的清理,等了大概20分鐘,發現還是能夠OpenProcess這個行程ID,
uj5u.com熱心網友回復:
有其它程式參考了它?
uj5u.com熱心網友回復:
那就是系統還沒有回收。或者這個句柄是否分配給其他行程了
系統沒有回收,但在任務管理器里也沒有找到這個行程ID,所以在想這個行程是不是被徹底回收掉了,有沒有什么思路提供?MSDN的解釋是如果這個行程有IO操作,會在IO操作完成后再由內核進行徹底的清理,等了大概20分鐘,發現還是能夠OpenProcess這個行程ID,
有其它程式參考了它?
沒有,唯一有可能的地方是這兩個行程之間有共享記憶體
uj5u.com熱心網友回復:
《Windows編程啟示錄》19.6 為什么有些行程在被終止之后還停留在任務管理器中
當某個行程結束時(可能是正常結束,也可能是因為呼叫了像TerminateProcess之類的函式),這個行程的用戶態模塊將被洗掉。但內核態模塊只有在與執行緒相關的所有驅動程式執行完成之后才會被洗掉。
例如,如果某個執行緒正處于I/O操作中,那么將會給負責I/O的驅動程式發送一個內核信號來取消這個操作。
如果驅動程式的行為是良好的,那么它將清除與這個未完成I/O相關的一些資訊并且釋放執行緒。
如果驅動程式的行為是不好的(可能是因為驅動程式管理的硬體表現出奇怪的行為),那么可能需要花很長的時間來清除這個未完成的I/O。在這段時間里,驅動程式將不會釋放這個執行緒(以及這個執行緒所在的行程)。實際的情況要更復雜一些,但這里的簡單模型對于我們的討論已經足夠。
……
換句話說,如果你終止了某個行程后還能在任務管理器中看到這個行程,那么實際上這個行程已經停止運行了,只不過還有些殘留的資訊保留在系統中,只有當與這個行程相關的所有驅動程式都完成了清除操作并且指向這個行程的句柄都已經關閉,行程才會完全消失。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/145167.html
標籤:進程/線程/DLL
上一篇:求解libfftw3f-3.dll does not match the current target platform
下一篇:求救大神!
