2013-03-30 19 views
8

Mac OS X(パイプ、ソケット、System V IPCなど)で使用可能なさまざまなIPCメカニズムを比較しています。Machポートが、レベルの選択肢。しかし、私は非常に基本的な問題に直面しました。つまり、プロセス間の(特に、親プロセスと子プロセスの)ポート間での送信権の取得です。子プロセスを持つMachポートを共有する

ファイル記述子とは異なり、ports are generally not carried over to forked processes。これは、それらを転送する他の方法が確立されなければならないことを意味します。私が見つけた唯一の関連するページはthis oneであり、その方法はsuggested by an Apple engineer in 2009であったにもかかわらず、彼らのメソッドはもはや機能しなくなり、決して保証されていなかったという更新を述べています。 (これはブートストラップポートを置き換えることを暗示していましたが、これでXPCが破られてしまいます)。彼らが推奨する置換えは廃止された関数を使用しているので、それはあまり魅力的な解決策ではありません。

さらに、私が古いソリューションについて気に入っていたことの1つは、ポートがそれを使用したプロセス間でかなりプライベートなままであったことです。一度フォークされたパイプ(pipeコール)のように、ポートの存在をブロードキャストする必要はありませんでした。 (別の解決策がある場合は、おそらくそれと一緒に暮らしていますが、ちょっと迷惑です。)親プロセスからMachプロセスへの送信権をどのようにして子プロセスに送るのですか?

答えて

0

試してみることの1つは、継承メカニズムとして例外ポートをハイジャックしていることです。カスタムポートを親の例外ポートとして設定し、子をフォークし、例外ポートからカスタムポートを取得し、親にタスクポートを送信し、親が例外ポートをリセットし、子の例外ポートをリセットし、 2人はそこから通信チャネルで進んでいく。 task_set_exception_ports()を参照してください。

+0

ええ、それはブートストラップポートの "まともな"ハックでしたが、他の特別なポートではやっていないと思います。 – zneak

2

bootstrap_registerが推奨されていませんが、bootstrap_check_inは使用されず、bootstrap_look_upを使用して子プロセスで後で取得できるポートを登録するために使用できます。 (これは残念ながらあなたが探しているプラ​​イバシーを提供しません)。

+0

「安全でない」とはどういう意味ですか? – Mecki

+0

OPについて:「古いソリューションについて気に入ったことの1つは、ポートがそれを使用するプロセス間でかなりプライベートなままであることです。ポートの存在をブロードキャストする必要はありませんでした」 – Danra

+0

Ahhh、わかりました。 「プライベート」と「セキュア」はほぼすべての面で全く異なる意味であるため、私はあなたがこの声明を参照しているとは思っていませんでした。明確化のためにありがとう。 – Mecki

0

マッハIPCを直接使用するのではなく、子プロセスをXPCサービスとして実装することをお勧めします。この場合、シーンの背後でMach IPCを使用するXPC APIを使用できますが、任意の詳細を処理する。親にXPCメッセージを送信する簡単なAPIと、簡単な返信を簡単に返すことができるクライアントでXPCメッセージを受信する簡単なAPIがあります。システムはあなたのためにすべてのハード部分を処理します。

https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

あなたがXPCのAPIを使用できない場合、あなたは(非推奨されていない)bootstrap_check_in()を使用してサービスを登録するとき、それはプライベートでないことを心に留めておくが、あなたは、ユーザーにそれを行う場合あなたのログインセッションにはプライベートになります。ルートプロセスはそれを見ず、他のユーザーのプロセスもそれを見ません。ただし、ルートプロセスでこれを行うと、すべてのセッションに表示されます。

また、IPCメッセージを送信する相手と送信しない相手を制御できます。機械メッセージを受信するとmach_msg_audit_trailer_tを要求することができます。そうすれば、送信者のaudit_token_tにアクセスできます。 audit_token_to_pid()を使用すると、送信者のpid_tを取得できます。あなたの子供のPIDを知っているので、メッセージがあなたの子プロセスによって送られた場合を除いて、単にすべてのメッセージを無視することができます(リソースが漏れないようにするには、mach_msg_destroy()にそれを渡します)。したがって、ポートを発見できないようにすることはできませんが、子プロセス以外のプロセスがこのポートを使用することは避けることができます。

最後に、あなたのポートにランダムな名前を付けるだけで、あなたの子プロセスだけがそれを知っている必要があるので、親プロセスに名前を動的に生成して、あなたのポートはソフトウェアがポートをスキャンしても見えますが、ほとんどのソフトウェアではハードコードされた名前を使用するだけです。

関連する問題