2013-06-23 11 views
7

Die Dokumentation für die interruptionHandler Block NSXPCConnection Zustände:Wird ein XPC-Unterbrechungshandler aufgerufen, wenn Launchd den Prozess beendet?

Eine Unterbrechung Handler, wenn der Remote-Prozess beendet wird oder abstürzt aufgerufen wird. Jedoch

, die Daemons and Services Programming Guide Staaten:

XPC Dienste werden von launchd verwaltet, die sie bei Bedarf startet, startet sie, wenn sie abstürzen und beendet sie (durch das Senden SIGKILL), wenn sie untätig sind. Dies ist für die Anwendung transparent, die den Dienst verwendet, außer für den Fall eines Dienstes, der bei der Verarbeitung einer Nachricht abstürzt, die eine Antwort erfordert. In diesem Fall kann die Anwendung sehen, dass seine XPC Verbindung ungültig geworden ist, bis der Dienst von

launchd neu gestartet wird

Wenn ein XPC Prozess für Müßig getötet wird, werde ich einen Rückruf in meinem interruptionHandler bekommen? Oder erhalte ich den Rückruf nur, wenn die App während der Verarbeitung einer Nachricht abstürzt? Ich frage, denn dieser Testfall scheint unmöglich zu simulieren. XPC Service Lifecycle ist leider eine sehr schwarze Box.

+0

Haben Sie herausgefunden, was es macht? Durch das Senden von SIGKILL wird der Unterbrechungshandler manuell aufgerufen. – ctietze

Antwort

2

Ja, der Unterbrechungshandler wird aufgerufen, wenn launchd den Dienst im Leerlauf stoppt.

Dies kann simuliert werden, indem man die natürliche Reaktion nutzt, die launchd auf den Speicherdruck hat: alle launchd gestarteten Dienste, die sich im Leerlauf befinden, stoppen, um das Problem zu beheben.

Ein simuliertes warnen Niveau Speicherdruck sollte genug sein, hier ist, wie Sie es tun:

sudo memory_pressure -S -l warn 

Und für kritisch:

sudo memory_pressure -S -l critical 

Dieser Zustand oft übersehen wird, wenn XPC Dienstleistungen zu testen. Es wird jedoch empfohlen, dass XPC-Dienste staatenlos sind. In den meisten Fällen sollte es also nicht darauf ankommen, dass Ihr Dienst gestoppt wird und beim nächsten Senden einer Nachricht neu gestartet werden kann. Und idealerweise hast du die Verbindung für ungültig erklärt, als du das letzte Mal damit fertig warst.

Launchd wird einen XPC-Dienst mit den obigen Bedingungen nicht stoppen, wenn eine laufende XPC-Transaktion ausgeführt wird (Lesen: eine Nachricht wird verarbeitet und/oder der Antwortblock wurde nicht aufgerufen).

Verwandte Themen