2011-06-30 122 views
2

如果我有一個手柄,它已經停止(殺死或剛剛結束)一些窗口過程:流程結束後會發生什麼?

  1. 將手柄(或更好它後面的內存)被重新用於另一個進程?
  2. 或者將GetExitCodeProcess()從現在起永遠得到正確的結果嗎?

如果1.是真的:GetExitCodeProcess()如何工作?
如果2.是真的:這不是說我可以通過啓動/終止新進程來降低操作系統,因爲我創建了越來越多的句柄(並且操作系統爲它們保留了內存)?

我對手柄的概念有點困惑。

預先感謝您!

+0

非常有趣。我敢打賭,GetExitCodeProcess將工作,直到父(呼叫)過程退出。目前沒有時間進行測試:) – 9dan

回答

7

句柄間接指向內核對象。只要有開放的手柄,對象就會保持活着。

將句柄(或更好的背後的內存)重新用於另一個進程?

句柄的數值(或者它被實現)可能被重用,但這並不意味着它總是指向相同的東西。就像進程ID一樣。

或者將例如GetExitCodeProcess()從現在開始永遠得到正確的結果?

否。當進程的所有句柄都關閉時,進程對象被釋放(連同其退出代碼)。請注意,正在運行的進程擁有一個隱式句柄。只要你需要,你可以拿着一個開放的手柄。

如果2是真的:那不是意味着我可以打倒OS與啓動/殺死新工藝,因爲我創造更多的句柄(和OS儲備存儲他們的)?

有很多方法可以使系統捱餓。它會開始大量交換,或者在某個時候不能產生新的進程。

+0

謝謝。澄清:如果我調用CreateProcess(),它返回PROCESS_INFORMATION結構中的句柄,GetExitCodeProcess()將工作,直到我關閉此(和任何其他)句柄? – beutelfuchs

+0

@ beuteluchs:是的,只要該進程至少有一個打開的句柄,查詢就可以工作。 –

+0

謝謝,幫了我很多。在MSDN上感覺有點失落。 – beutelfuchs

1

簡短的回答:

GetExitCodeProcess作品,直到你打電話CloseHandle,什麼工藝對象將被釋放,並可以重複使用之後。

長答案: 請參閱Cat Plus Plus的答案。

+0

也謝謝! – beutelfuchs