POSIX では、プロセスは 2 つの基本レイヤを介して互いに「関連」します。
親プロセスと子プロセスの階層です。
セッションおよびプロセスグループの階層。
setpgid
setsid
ユーザープロセスには、後者、via、およびBeyondを介して変更されない多くの制御機能があります。振り返ってみると、親と子の関係がどれほど重要なのかいつも気になります。
これまで私が理解した内容をまとめると、次のようになります。
子供の立場から見ると、親と子供の関係は当然重要です。親さまざまなシステムコール(たとえば、
wait
およびsetpgid
)は子プロセスでのみ許可されるためです。セッション - グループ - プロセスの関係は次のとおりです。みんな
kill
プロセスグループ全体の操作などのシステムコールは、setpgid
同じセッション内のグループに参加するためにのみ使用でき、SIGHUP
セッションリーダーがセッション内のすべてのプロセスに送信される場合は、セッションリーダーであってもセッションの他のプロセスであっても構いません。セッションフォアグラウンドプロセスグループプロセスは終了します。さらに、親プロセスの観点から見ると、2つの層は明らかに関連しています。なぜなら、
setsid
新しい子プロセスにのみ影響し、setpgid
子プロセスでのみ使用できるからです。しかし、子プロセスの観点からは、本質的に関係がないようです。親プロセスの終了は、プロセスのグループやセッションには影響しません。
しかし、子プロセスが現在親が何であるかを気にする理由はまったくありません。だから、次の質問があります。getppid()
現在の値がサブプロセスの観点からどのような意味を持ちますか?、ビルドプロセスが終了したことを確認することに加えて?
同じ質問を異なる方法で尋ねるには、同じプログラムが2つの異なる方法で同じ親プログラムで2回生成されたと想像してください。
最初の子供はいつものように生まれ、
fork()
すぐにつながりましたexec()
。第2のサブプロセスは間接的に生成される。親プロセスが を呼び出した後、
fork()
子プロセスが呼び出されます。返品電話してくださいfork()
。孫呼び出しプロセスexec()
。その後、直系の子が終了するので、孫は孤児になり、そのPPIDはPID 1に再割り当てされます。
この仮想シナリオで他のすべてが同じであると仮定すると、合理的なプログラムが異なる動作をする理由はありますか?これまで私の結論は「いいえ」のようです。これは、プロセスから継承されたファイル記述子と同様に、セッションが変更されていないためです。しかし、わかりません。
注:「通信する親PIDを取得する」は、この質問に対する有効な答えではないと思います。なぜなら、孤児プロセスは通常PPIDを1に設定できないからです(一部のシステムは孤児プロセスのPPIDを別の値に設定します)。 )、したがって競合状態を回避する唯一の方法は、次を呼び出して親プロセスIDを取得することです。getpid()
今後フォークしてから、サブアイテムでその値を使用します。
ベストアンサー1
この質問を見て興味がありました。知る前にgetppidが使用されたことを見たことがありますが、どこで使用したのか覚えていません。だから私はすべてのLinuxシステムコールが利用可能であると思われるプロジェクトに興味を持っていました。システム。一つGitHubを検索後でもう少し一般的なユースケースを説明する2つの用途を見つけました(他の用途もありますが、systemdにはより具体的です)。
存在するSD通知。状況によっては:systemdは、サービスの開始時期を知っている限り、そのサービスに依存するすべてのサービスを開始できます。これは通常Cプログラムを介して行われます。sd_通知API、これはデーモンがsystemdに状態を知らせる方法です。
もちろん、シェルスクリプトをサービスとして使用する場合、C関数を呼び出すことは完全に可能ではありません。したがって、systemdは次のように提供されます。システム通知コマンド、sd_notify APIの小さなラッパーです。問題1:systemdは送信されるメッセージのPIDも知っている必要があります。 systemd-notifyの場合、これは独自のPIDになり、すぐに消える短期プロセスIDになります。役に立たない。
おそらくあなたはすでに私が何をするかを知っているでしょう。 systemd-notifyはgetppidを使用して親プロセスのPIDを取得します。これは通常、実際のサービスプロセスであるためです。つまり、寿命の短い CLI アプリケーションは getppid を使用して親プロセスに代わってメッセージを送信できます。
これを発見したとき、私はgetppidを使用できる別のUnixツールであるpolkitを考えました。これは、D-Busメッセージの送信や特権アプリケーションの実行などの操作を制御するために使用されるプロセス認証フレームワークです。 (少なくともpolkitの認証エージェントが表示するGUIパスワードプロンプトを見たようです。)polkitにはsudoという実行可能ファイルが含まれています。
pkexec
これはsudoと多少似ていますが、現在はpolkitが認証に使用されています。 polkitは承認を要求するプロセスのPIDを知る必要があります。はい、わかりました。pkexec は getppid を使って以下を探します。。(私も視聴しながら発見しました。polkitのTTY認証プロキシでも使用されます。.)
これは少し面白いですが、まだ注目に値する。 getppid は次の目的で使用されます。PR_SET_PDEATHSIGシミュレーションこのフラグが設定されている場合、親が死亡した場合です。 (このフラグは、親プロセスが終了したときにSIGKILLなどの信号を子プロセスに自動的に送信する方法にすぎません。)