与えられたシェルプロセス(例:sh )とその子プロセス(例:cat )、 Ctrlの動作をどのようにシミュレートできますか + C シェルのプロセスIDを使用していますか?
これは私が試したことです:
shを実行しています 次にcat :
[[email protected] ~]$ sh
sh-4.3$ cat
test
test
SIGINTを送信する catへ 別の端末から:
[[email protected] ~]$ kill -SIGINT $PID_OF_CAT
cat 信号を受信して終了しました(予想どおり)。
親プロセスへのシグナルの送信は機能していないようです。 信号がcatに伝播されないのはなぜですか 親プロセスに送信されたときsh ?
これは機能しません:
[[email protected] ~]$ kill -SIGINT $PID_OF_SH
承認された回答:
どのようにCTRL + C 動作します
まず、 CTRLがどのように行われるかを理解することです。 + C 動作します。
CTRLを押すと + C 、端末エミュレータはETX文字(テキストの終わり/ 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 その端末のために?
これは非常に簡単になります。
関連:bashは\ xC3 \ x89をÉに変換しますか?
$ttyと仮定しましょう ターゲットにする端末です(これは、tty | sed 's#^/dev/##'を実行することで取得できます。 ターミナルで)。
kill -INT -$(ps h -t $tty -o tpgid | uniq)
これにより、SIGINTが$ttyのフォアグラウンドプロセスグループに送信されます。 です。