~に関連付けられるシグナルマニュアルページ:
fork(2) によって生成された子プロセスは、親プロセスのシグナル構成コピーを継承します。 execve(2) 中に処理された信号の処理は、デフォルト値にリセットされます。無視された信号の処理は変更されません。
この場合、子プロセスがフォアグラウンドで実行されるのか、バックグラウンドで実行されるのかはまったく関係ありません。
例:
xterm
子bgプロセスから始めるとshell
...
xterm &
xterm
...その後、bgプロセスを開始します。
`ls -lR / &`
シェルでプロセスを停止すると、ls
プロセスは停止しますか?xterm
kill -STOP [pid_of_xterm]
?
そうではありませんが、なぜそうなのかわかりません。
あなたの助けに感謝します...
答え1
fork(2) によって生成された子プロセスは、親プロセスのシグナル構成コピーを継承します。
これは子供たちを意味するハンドル信号は上位信号と同様に処理される。つまり、同じシグナルハンドラと同じ無視されたシグナルセットを持ちます。これは、親プロセスにシグナルを送信することが何らかの方法で子プロセスにシグナルを送信することを意味するわけではありません。
プロセス可能信号をサブアイテムの一部または全部に渡すように信号ハンドラをプログラムすることが可能であるが、これは一般的ではない。ただし、SIGKILL、SIGSTOPなど処理できないシグナルに対しては実行できない。これを行うまれなケースは、対話型シェルがSIGHUPを実行しているジョブに伝播する場合です。
あなたの例では、lsプロセスがシェルの子プロセスであり、シェルがxtermの子プロセスである場合、xtermプロセスにSTOP信号を送信するとxtermプロセスのみが停止します。シェルやlsには影響しません。ある時点で、ls詰まった端末がデータを読み取れないため、端末に書き込もうとします。これはwrite
、lsプロセスのシステムコールが信号に関係なく長い時間がかかることを意味します。
親と子の関係でプロセスグループにシグナルを渡す方法があります。これはシグナルを受信するのではなく呼び出す人によって決まります。プロセスグループ。プロセスグループの目的は、タスクが複数のプロセス(パイプなど)で構成されていても、シェル全体にシグナルを送信できるようにすることです。