シェルプロセス(例sh
)とそのサブプロセス(例cat
)が与えられた場合、シェルのプロセスIDを使用して+アクションをシミュレートする方法はCtrl?C
私が試したことは次のとおりです。
sh
次に実行しますcat
。
[user@host ~]$ sh
sh-4.3$ cat
test
test
SIGINT
cat
他の端末から送信:
[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
。