SIGINTが親プロセスに送信されたときに子プロセスに伝播されないのはなぜですか?

SIGINTが親プロセスに送信されたときに子プロセスに伝播されないのはなぜですか?

シェルプロセス(例sh)とそのサブプロセス(例cat)が与えられた場合、シェルのプロセスIDを使用して+アクションをシミュレートする方法はCtrlC


私が試したことは次のとおりです。

sh次に実行しますcat

[user@host ~]$ sh
sh-4.3$ cat
test
test

SIGINTcat他の端末から送信:

[user@host ~]$ kill -SIGINT $PID_OF_CAT

cat信号が受信され終了します(予想どおり)。

親プロセスにシグナルを送信するのはうまくいかないようです。シグナルがcat親プロセスに送信されたときに伝播されないのはなぜですかsh

これはうまくいきません:

[user@host ~]$ kill -SIGINT $PID_OF_SH

ベストアンサー1

CTRL+C仕組み

最初に理解する必要があるのは、CTRL+がどのようにC機能するかです。

CTRL+を押すと、C端末エミュレータはETX文字(End of Text / 0x03)を送信します。
TTYは、この文字を受信するとSIGINTを端末のフォアグラウンドプロセスグループに送信するように構成されています。この設定はを実行して見ると見ることがstty -aできますintr = ^C;。これPOSIX仕様INTR を受信すると、SIGINT を端末のフォアグラウンド・プロセス・グループに送信する必要があることを示します。

フォアグラウンドプロセスグループとは何ですか?

今問題は、フォアグラウンドプロセスグループが何であるかを判断する方法です。フォアグラウンドプロセスグループは、単にキーボードから生成されたすべての信号(SIGTSTP、SIGINTなど)を受信するプロセスグループです。

プロセスグループIDを確認する最も簡単な方法は、次を使用することですps

ps ax -O tpgid

2番目の列はプロセスグループIDです。

プロセスグループにシグナルを送信するには?

これでプロセスグループIDが何であるかがわかったので、グループ全体にシグナルを送信するPOSIXの動作をシミュレートする必要があります。

killグループIDを前に追加するだけです。たとえば、プロセスグループIDが1234の場合は、次のようにします。-

kill -INT -1234

端末番号を使用してCTRL+をシミュレートします。C

CTRLしたがって、上記は+をC手動プロセスとしてシミュレートする方法を示しています。しかし、TTY番号を知っていて、その端末の+をエミュレートしたい場合はCTRLどうすればいいですか?C

とても簡単です。

$ttyターゲットにしたい端末だとしましょう(tty | sed 's#^/dev/##'端末で実行して取得できます)。

kill -INT -$(ps h -t $tty -o tpgid | uniq)

これにより、フォアグラウンドプロセスグループにSIGINTが送信されます$tty。  

おすすめ記事