私がCで書いたプログラムは、子プロセスを閉じるためにfork()を使用します。どちらのプロセスも終了しません。コマンドラインからプログラムを起動してcontrol-cを押すと、どのプロセスが割り込み信号を受け取りますか?
答え1
一度試してみてはいかがでしょうか?使用する簡単なプログラムです。signal(3)
SIGINT
親プロセスと子プロセスをキャプチャし、そのプロセスが到着すると、プロセスを識別するメッセージを印刷します。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
if (!fork()) {
signal(SIGINT, &child_trap);
sleep(1000);
exit(0);
}
signal(SIGINT, &parent_trap);
sleep(1000);
return 0;
}
それをと呼びましょうtest.c
。これで実行できます。
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
端末で発生した割り込み信号は、上位プロセスグループと下位プロセスグループを含むアクティブプロセスグループに伝達される。。見ることがchild_trap
できますparent_trap
Ctrl- を押すと実行されますC。
一つあるfork
POSIX中和シグナル間の相互作用の長い議論。ここで最も重要な部分は次のとおりです。
fork()以降のプロセスグループに送信されるシグナルは、親プロセスと子プロセスの両方に渡される必要があります。
彼らはまた、いくつかのシステムが正確に正しい方法で動作しない可能性があることを指摘しています。特に信号が非常に近い時間に到着した場合は、はいfork()
。個々の試みごとに相互作用がほとんどないため、これらのシステムの1つを使用しているかどうかを判断するには、コードを読むか、または多くの運が必要になることがあります。
その他の便利な点は次のとおりです。
- 手動で生成され、単一のプロセスに送信される信号(おそらく
kill
)渡されますただ親プロセスか子プロセスであるかに関係なく、プロセスに適用されます。 - プロセス間でシグナルハンドラが実行される順序は定義されていないため、最初に実行されるシグナルハンドラに依存することはできません。
- もしあなたならいいえ割り込みハンドラを定義するか、明示的に信号を無視すると、両方のプロセスが
SIGINT
コードで終了します(デフォルトの動作)。 - 1つは致命的ではないように信号を処理し、もう1つは処理しないと、ハンドラのない1つは終了し、もう1つは続行します。