8

interruptionHandler状態ブロックのドキュメントNSXPCConnection:

リモート プロセスが終了またはクラッシュした場合に呼び出される割り込みハンドラ。

ただし、Daemons and Services Programming Guideには次のように記載されています。

XPC サービスは、launchd によって管理されます。launchd は、必要に応じて起動し、クラッシュした場合は再起動し、アイドル状態の場合は (SIGKILL を送信して) 終了します。これは、応答を必要とするメッセージの処理中にサービスがクラッシュした場合を除き、サービスを使用するアプリケーションに対して透過的です。その場合、launchd によってサービスが再起動されるまで、アプリケーションは XPC 接続が無効になったことを確認できます。

アイドル状態であるために XPC プロセスが強制終了された場合、 でコールバックを取得できますinterruptionHandlerか? または、メッセージの処理中にアプリがクラッシュした場合にのみコールバックを取得しますか? このテスト ケースはシミュレートできないように思われるので質問します。残念ながら、XPC サービスのライフサイクルは非常にブラック ボックスです。

4

1 に答える 1

2

はい、launchd がアイドル状態のためにサービスを停止すると、割り込みハンドラが呼び出されます。

これは、launchd がメモリ不足に対して持っている自然な反応を活用することでシミュレートできます。つまり、問題を軽減するために、アイドル状態のすべての launchd 起動サービスを停止します。

シミュレートされた警告レベルのメモリ プレッシャで十分なはずです。その方法は次のとおりです。

sudo memory_pressure -S -l warn

そして重要な場合:

sudo memory_pressure -S -l critical

この条件は、XPC サービスをテストするときに見落とされることがよくあります。ただし、XPC サービスはステートレスになるように設計することをお勧めします。そのため、ほとんどの場合、サービスが停止しているかどうかは問題ではなく、次にメッセージを送信したときに launchd で再開できます。そして理想的には、最後に接続を行ったときに接続を無効にしました。

進行中の XPC トランザクションがある場合、Launchd は上記の条件で XPC サービスを停止しません (読み取り: メッセージが処理されている、および/または応答ブロックが呼び出されていない)。

于 2015-09-26T09:23:19.070 に答える