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
そして、みんなが私を助けてくれてありがとう:)