2013-06-23 26 views
7

NSXPCConnection狀態的interruptionHandler塊的文檔:當launchd殺死進程時,是否調用XPC中斷處理程序?

的中斷處理程序被調用,如果遠程進程退出或崩潰。

然而,Daemons and Services Programming Guide狀態:

XPC服務由launchd會,這將啓動他們的需求,重新啓動他們,如果他們崩潰,並終止他們(通過發送SIGKILL),當他們處於閒置狀態管理。這對使用服務的應用程序是透明的,除了處理需要響應的消息時崩潰的服務。在這種情況下,應用程序可以看到,直到該服務由launchd會

重啓如果XPC過程中殺害被閒置的XPC連接不可用,我會在interruptionHandler得到一個回調?或者,在處理消息時應用程序崩潰時,我是否只會收到回調?我問,因爲這個測試案例似乎不可能模擬。 XPC服務生命週期不幸是一個非常黑的方塊。

+0

你知道它做了什麼嗎?手動發送SIGKILL調用中斷處理程序。 – ctietze

回答

2

是的,如果launchd停止空閒服務,中斷處理程序將被調用。

這可以通過利用自然反應推動存儲壓力來模擬:停止所有啓動的服務,這些服務閒置以幫助解決問題。

模擬警告的內存壓力水平應該夠了,這裏是你如何做到這一點:

sudo memory_pressure -S -l warn 

而對於關鍵:

sudo memory_pressure -S -l critical 

測試XPC服務時,這種情況常常被漏診。但是,建議XPC服務設計爲無狀態,所以在大多數情況下,如果您的服務已停止並且可以在您下次發送消息時通過啓動重新啓動,則無關緊要。理想情況下,當您最後一次完成連接時,您已將連接無效。

如果存在正在進行的XPC事務(讀取:正在處理消息和/或尚未調用回覆塊),則Launchd不會停止具有上述條件的XPC服務。