回答:
試してみてみませんか?これは、親プロセスと子プロセスの両方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。
POSIXの相互作用fork
とシグナルに関する長い議論があります。ここで最も重要な部分は次のとおりです。
fork()の後にプロセスグループに送信されるシグナルは、親と子の両方に配信される必要があります。
彼らはまた、特に信号が時刻の非常に近くに到着するとき、いくつかのシステムが正確に正しい方法で振る舞わないかもしれないことに注意しますfork()
。これらのシステムの1つを使用しているかどうかを判断するには、おそらく個々の試行で相互作用がほとんど発生しないため、コードを読むか、または多くの運が必要になります。
その他の便利な点は次のとおりです。
kill
)に送信されるシグナルは、親か子かに関係なく、そのプロセスにのみ配信されます。SIGINT
コード(デフォルトの動作)で終了します。