向子进程和父进程发送信号

3
据我了解,发送给父进程的信号不应该发送到子进程。那么为什么下面的例子中SIGINT会同时到达子进程和父进程呢?
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void sigCatcher( int );

int main ( void ) {
    if (signal(SIGINT, sigCatcher) == SIG_ERR) {
        fprintf(stderr, "Couldn't register signal handler\n");
        exit(1);
    }
    if(fork() == 0) {
        char *argv[] = {"find","/",".",NULL};
        execvp("find",argv);
    }
    for (;;) {
        sleep(10);
        write(STDOUT_FILENO, "W\n",3);
    }

    return 0;
}

void sigCatcher( int theSignal ) {
        write(STDOUT_FILENO, "C\n",3);
}

当你执行 fork 时,你会创建一个精确的进程副本来运行该命令,并且由于信号方法在 fork 之前执行,子进程和父进程都会捕获到该信号。 - Ionut Hulub
但是 exec 会替换所有的代码,因此信号处理程序会被覆盖。 - Ahtenus
1个回答

3
如果您通过键入^-C发送SIGINT信号,则该信号将发送到前台处理组中的所有进程。如果您使用kill -2,它只会发送给父进程(或您指定的任何其他进程)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接