私のアプリ (Cocoa) には、 Nathan de Vries によるSMJobBlessXPC サンプル コードSMJobBless
をモデルにした、 を使用してインストールされる特権ヘルパー ツール (C) が含まれています。エクスポートされた Mach XPC 接続への接続試行で正常に起動します。ここまでは順調ですね。
私が理解できないのは、後でそのプロセスを終了する方法です。私のアプリケーションが終了すると、ヘルパー ツールはもはやビジネスを実行していません。しかし、私はそれを終了する方法を一生理解できません。
XPC イベントのハンドラーからの呼び出しexit(0)
は効果がないようです。おそらく、プロセスではなく現在のスレッドexit
を終了するドキュメントの状態が原因です。私の関数は次のようになります。main
int main(int argc, const char * argv[])
{
// setup a Mach XPC service so that we can receive communication from the app
xpc_connection_t service = xpc_connection_create_mach_service("com.my.service.name", dispatch_get_main_queue(), XPC_CONNECTION_MACH_SERVICE_LISTENER);
xpc_connection_set_event_handler(service, ^(xpc_object_t connection){
handle_xpc_connection(connection);
});
xpc_connection_resume(service);
dispatch_main();
xpc_release(service);
return 0;
}
戻らないことはわかっdispatch_main
ているので、それと関係がある可能性がありますが、プロセスを正常に終了させる方法がいくつかあるはずです。を使用するように切り替える必要がありCFRunLoop
ますか?
結果として、プロセスが途中で終了しないようにするにはどうすればよいですか? ヘルパー ツールまたはメイン アプリのいずれかが、終了する適切なタイミングを正確に認識します。ジョブが開始されると、終了するまで実行し続けますか? 私はlaunchdのライフサイクル管理について少し曖昧であり、(私が見つけることができる) launchd.plist(5)
.