与えられたシェルプロセス(例: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
のフォアグラウンドプロセスグループに送信されます。 です。