2017-06-25 11 views
1

私は、直接の親からその最古の祖先(通常launchd)までの選択プロセスの親ツリーを明らかにするOSXツールを維持しています。launchdを使ってプロセスが間接的に起動された場合のプロセスの「本当の」親プロセスの取得

しかし、バンドルアイコンをダブルクリックする、またはコマンドopenを使用してbashからプロセスを実行するなどのイベントを使用して、検査プロセスがlaunchdから間接的に起動された場合、このプロセスチェーンが壊れる可能性があります。このような場合は、bashまたはfinderのいずれかに対応しています。

おそらく、これらのイベントがこのメカニズムを介してlaunchdに渡っていると仮定しているので、XPCメッセージングレイヤーは答えです。しかし、他の利用可能なOSXフレームワークはいつでも歓迎します。

EDIT:

私は実行中のプロセス自体を切り離した場合、私はそれがPPIDだ復元できませんでしたことを理解し、私の目標は、プロセスの作成を開始し、発信者を追跡することです。

ありがとう

+0

あなたが探しているものを全くわからないが、プロセス自体を切り離した場合、それはその直接の親としてのpid 1(INIT)を持っている.... –

+0

私は私ができなかったことを理解しプロセスが人生の途中で切り離されたときにppidを取得しないでください。しかし、恐らくダブルクリックイベントから生成されたばかりのプロセス呼び出し元をトレースする方法があります。ファインダとlaunchdの間の通信をトレースすることによって – Zohar81

答えて

0

あなたが見ているのは正しい動作です。

ユーザーがFinderからアプリケーションバンドルを開くとき、またはターミナルでopenコマンドを使用するとき、Launch Servicesがアプリケーションの実行を担当します。

アプリケーションがOS X/macOSに導入されると、そのバンドルのInfo.plistファイルに宣言されているように、バンドルIDに従ってLaunch Servicesに登録されます。

ターミナルでユーザがダブルクリックするかopenを使用すると、Launch Servicesはバンドル識別子を受け取り、以前に登録されたアプリケーションを起動します。

アプリケーションバンドルの識別子が一意でない場合、問題が発生する可能性があることに注意してください。 Launch Servicesは、同じバージョンとアプリケーション識別子を持つ2つのアプリケーションバンドルを使用して、登録した最初のアプリケーションを実行しますが、ユーザーが実行しているとは限りません。

逆に、端末を使用してopenを使用せずにアプリケーションバンドル内のバイナリを直接実行すると、その親はTerminalによって使用されるシェルアプリケーションになります。例えば: -

/Applications/Calculator.app/Contents/MacOS/Calculator 
+0

こんにちは、私に質問してくれてありがとう。私はそれが正しい動作であることを知っていますが、「ファインダ」のダブルクリックイベントか「オープン」コマンドのいずれであれ、プロセス作成を開始したエンティティをトレースできる方法があれば疑問です。 – Zohar81

+0

ユーザーモードから、いいえ。あなたが本当に決まっているなら、私はあなたがカーネルの拡張でそれを行うことができると期待していますが、これはSOの質問に対する答えを超えています。 – TheDarkKnight

+0

私は必要に応じてkextを書くつもりですが、xpcがマッハメッセージを通っていない限り、launchdへのメッセージングは​​カーネルを経由しないと考えました。おそらくあなたは私にどこから始めるべきかに関する一般的なガイドラインを与えることができます?ありがとうございました – Zohar81

関連する問題