こんにちは。この内容を理解するのに役立つすべての人に感謝します。
Linuxでは、親プロセスと子プロセスの間でIPCがどのように機能するかについて30,000フィートのビューがあると思います。 APIを介してカーネルとの通信が正常に機能しています。
たとえば、... bashシェルがpsコマンドプロセスを分岐している場合... psプロセスがIPCを使用して結果をbashシェルに返すとします...それが動作する方法であれば、APIを介して進行します.. .そうですが、具体的に言及された内容が見つかりません。
もう一度…誰でも私に助けてくれてありがとう。
答え1
あなたの例では、実際のIPCはあなたが思うよりもはるかに少ないです。
bash
コマンドが実行されると、ps
psプロセスは親プロセスから標準入力、標準出力、および標準エラー設定のファイルハンドル、現在の作業ディレクトリなどを継承します。
このps
コマンドは、単に出力を標準出力ファイル・ハンドルに書き込みます。このハンドルは通常、カーネルTTYドライバが担当するユーザーのTTYデバイスを指します。コンソールセッション(Linux仮想コンソールであれ実際のシリアルコンソールであれ)は、最新のシステムからユーザー画面に直接接続します。 TTYデバイスは通常、別のデバイスに返される擬似TTYスレーブデバイスです。プロセス:このプロセスは、ローカルGUIデスクトップのターミナルエミュレーションプログラムであるか、リモートsshd
ログインに使用できます。bash
コマンドを実行したシェルはps
まったく関与しません。
bash
あなたの例では、プロセス間通信はps
非常に簡単です。ps
プロセスが終了すると、最初は「ゾンビ」状態になります。プロセスメモリは解放され、残っているのはプロセステーブルスロットのみですps
。プロセス終了生成された戻りコード。
bash
カーネルは、それを探しているゾンビプロセスの親プロセスにSIGCHLD信号を送信しますwait(2)
。信号が受信されると、プロセスが終了したときに生成された戻りコードbash
も受信されます。ps
シェルはそれを特殊なシェル変数に入れて、$?
新しいコマンドプロンプトを出力するか、実行中のスクリプトを続行します(ps
コマンドがスクリプトから開始された場合)。
同時に、リターンコードが親プロセスに正常に渡されたため、カーネルはps
この方法で親プロセスが占有するプロセステーブルスロットを解放し、ゾンビプロセスは保留になります。