/ / Linux bashスクリプトの親プロセスと子プロセスの関係-linux、bash、shell、process、pid

Linuxでの親プロセスと子プロセスの関係bashスクリプト - linux、bash、shell、process、pid

Linuxプロセスについて質問がありますが、理解できません。
この問題は、「Advanced Bash Script」という本に由来します。コードは次のとおりです(簡略化しました)。

#! /bin/bash
# spawn.sh
sleep 1
sh $0   # fork a child process here and into infinite loop

exit 0  # the script will never come here

私が走ったとき ./spawn.sh シェルでは、プロセスはそこでスタックし、しばらくするとそこに多くの「sh spawn.sh」プロセスが存在します。
現在、プロセス間の関係は次のようになっていると思います。

./spawn.sh process(pid:10000)--->子プロセス(pid:10001)--->子プロセス(pid:1002)--->子プロセス(pid:1003)--->などに

シェルでControl-Cを押すと、親プロセスが終了し、 そして、そのすべての子プロセスも終わりました。これは私が理解できないところです。なぜすべての子供が死ぬのですか?プロセス間の関係は次のようにすべきだと思います:

init(pid:1)--->子プロセス(pid:10001)--->子プロセス(pid:1002)--->子プロセス(pid:1003)--->など

しかし、事実は かのように 親プロセスは、終了したときに子プロセスにシグナルを送信するため、すべての子プロセスが1つずつ消滅します。これは正常ですか、それともシェルスクリプトの機能ですか?

事前にどうもありがとうございました。

回答:

回答№1は1

シェルでControl-Cを押すと、親プロセスが終了し、 そのすべての子プロセスも終わりました。これは私ができないところです 理解する。なぜすべての子供が死ぬか

Ctrl-Cを押すと、SIGINTは親プロセスだけでなく、プロセスグループ全体にも送信されます。これが意味することは、3つのプロセスすべてがSIGINTを取得するため、プロセスが停止することです。この動作を確認するには、

trap "process $$ exiting" INT

子が「親に反応しない」ことを確認する簡単な方法は、スクリプトで1つの子を生成してから親を殺すことです。


回答№2の場合は0

Control-Cは、元のシェルではなく、最新の子を殺しています。いつ sh $0 終了すると、次のコード行により現在のシェルも終了し、完了したプロセスのカスケードが元の親に戻ります。


回答№3の場合は0

私は今答えを知っていると思います。 これは、Control-CがSIGINTをシェルスクリプトプロセスだけでなく、そのサブプロセスにも送信するためです。これらのプロセスはSIGINTをトラップしないため、終了しました。
コマンド 殺す-2 Ctrl-Cと同じではありません。詳しくは、こちらをご覧ください。 http://ajhaupt.blogspot.com/2011/01/whats-difference-between-ctrl-c-and.html
そして、みんなが私を助けてくれてありがとう:)