2012-02-10 19 views
1

私はMAC OS上でアプリケーションを開発しています。これは2つの部分から成っています - UI要素とデーモン(継続的に実行する必要があり、終了時に再起動する必要があります)。現在、私はlaunchctlを使ってデーモンを再起動しています。Mac OSでの通信の問題

しかし、別の問題があります。私はお互いに通信するために私のアプリケーションの2つの部分が必要です。このため私は同じもののために(hereとして与えられた)のためのdistibutedオブジェクトを使用しています。しかし、これはlaunchctlでデーモンを起動すると動作しません。誰かが何かの代替案を提案できますか?

答えて

2

私はNSDistributedNotificationsを使用して、これを1つのアプリで、さらに10.7でも処理することができます。これは損失の可能性があるため、ハンドシェイクを行う必要があります(つまり、ackの通知とタイムアウトが発生した場合の再送信が含まれます)。このアプローチの副作用は、複数のクライアントが稼動している場合(特に高速ユーザー切り替えの場合)、すべてのクライアントが通知を受信することです。このアプリの特別なケースでは良いことだ。また、実装が非常に簡単です。

別のアプリでは、2つのFIFOを使用します。サーバーは一方に書き込み、他方から読み取ります。クライアントは反対のことを行います。もちろん、同じことを達成するためにネットワークソケットを使用することもできます。私はFIFOを好む傾向があります。なぜなら、ネットワークソケットをロックダウンする必要はないからです。

つまり、launchd下で分散オブジェクトを使用してどのような問題が発生していますか?あなたは10.7の問題を見ていますか(これはlaunchdコンテキストの周りのルールを変更しました)?

ポートにアクセスしたときにlaunchdを使用してデーモンを遅延ロードする(これが通常の方法です)。あなたはlaunchdaemonの代わりにlaunchagentを使うことを考えましたか?


EDIT:

ああ...ブートストラップサーバ。はい。彼らと話すためには、正しいブートストラップコンテキストで物事を実行する必要があります。ログインセッションのブートストラップコンテキストは、windowserverプロセスに根ざしています。 LaunchDaemonsは異なるコンテキストで実行されるため、ログインセッションと直接通信することはできません。いくつかの背景読み:私はlaunchctl bsexecを使用せずに、正しいコンテキストにプロセスを取得するためにとにかくを認識していないです

。 Launchdには技術的にAPIがありますが(launchctlはAPIを使用しています)、十分に文書化されていません。 opensource.apple.comからsourceを引き出すことができます。

あなたがNSDistributedObjectのままであっても、可能ならばブートストラップサービス以外のものを使用しようとします。私が言及したように、私は他のツールを使い、NSDistributedObjectを避ける傾向があります。私の意見では、RESTがSOAPより優れているのと同じ理由で、単純なプロトコルが通常リモートオブジェクトよりも優れています。 (YMMV)

+0

分散オブジェクトでは、[NSMachBootstrapServer sharedInstance]に接続を登録していました。しかし、私のアプリケーションとデーモンのためにこの関数から返されたオブジェクトは異なっていました。デーモンを起動するためにsudoだけを使用するまではうまくいきましたが、sudo launchctlでの作業は停止しました。あなたは何かを提案できますか? –

1

sudo launchctlを使用してデーモンを起動する場合は、 IPCにはCFMessagePortDistributed objectを使用しないでください。 CFMessagePortDistributed objectはブートストラップサービスを使用して実装されています(多くのMac OS XサブシステムはMachメッセージを中央サービスと交換することで動作します)。これは通常、プロセスが名前でサービスをルックアップできるMachブートストラップサービスを使用して行われます。 DO or CFMessagePortを使用する場合は、あなたはブートストラップ名前空間の問題にぶつかるでしょう。 sudo launchctlを使用してデーモンを起動するとき。サービスはルートブートストラップ名前空間に登録され、クライアント(ユーザーモードで実行中)はそのサービスを使用できなくなります。
あなたがUNIX Domain Socketsを使用する必要があります

$ launchctl bslist 
$ sudo launchctl bslist // If you are using sudo lunchctl 

を使用して、ブートストラップサービスを確認することができます。 UNIXドメインソケットはTCP/IPソケットに似ていますが、通信は常にコンピュータにとってローカルになっています。 UNIXドメインソケットには、TCP/IPソケット用の同じBSDソケットAPIを使用してアクセスします。主な違いはアドレス形式です。 TCP/IPソケットの場合、アドレス構造(バインド、接続などに渡すもの)は(sockaddr_in)で、IPアドレスとポート番号が入っています。 UNIXドメインソケットの場合、アドレス構造体はパス(struct sockaddr_un)です。クライアント/サーバー環境でUNIXドメインソケットを使用する例については、サンプルコード'CFLocalServer'を参照してください。
このTechnical Note TN2083 Daemons and Agents
Daemon IPC Recommendations
Mach Bootstrap Basics

。あなたは、名前空間の間 を伝えることができない別のマッハ名前空間を持つ各ユーザーに見てみましょう。ソケット(NSSocketPort) を代わりに使用する必要がありますが、これに限定されません。 [1]

関連する問題