GNU/Linux >> Linux の 問題 >  >> Linux

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

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


Linux
  1. Linux – -9プロセスを強制終了すべきではないのはいつですか?

  2. 子プロセスのPgidが親のPidではないのはなぜですか?

  3. 親が終了した後に子プロセスを終了させる方法は?

  1. 子プロセスが親の SIGINT を受け取る

  2. Linuxで親プロセスが強制終了された後、子プロセスがまだ生きているのはなぜですか?

  3. Bash:子スクリプトが SIGINT をトラップするときに親スクリプトが SIGINT で終了しないのはなぜですか?

  1. プロセスを kill -9 してはいけないのはいつですか?

  2. 子プロセスが作成直後に exec() または exit() を呼び出すときに vfork() が使用されるのはなぜですか?

  3. sudo vi <filename> を実行しても構文が強調表示されないのはなぜですか?