Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 同时发送给子进程和父进程的信号_C_Unix_Signals - Fatal编程技术网

C 同时发送给子进程和父进程的信号

C 同时发送给子进程和父进程的信号,c,unix,signals,C,Unix,Signals,据我所知,发送给父进程的信号不应该发送给子进程。那么,为什么在下面的示例中,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)

据我所知,发送给父进程的信号不应该发送给子进程。那么,为什么在下面的示例中,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);
}
#包括
#包括
#包括
#包括
无效信号捕捉器(int);
内部主(空){
if(信号(SIGINT,SIGCATHER)=SIG_ERR){
fprintf(stderr,“无法注册信号处理程序”\n);
出口(1);
}
如果(fork()==0){
char*argv[]={“find”,“/”,“,”,NULL};
execvp(“查找”,argv);
}
对于(;;){
睡眠(10);
写入(标准文件号,“W\n”,3);
}
返回0;
}
无效信号捕捉器(内部信号){
写入(标准文件号,“C\n”,3);
}

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

当您执行fork时,您会复制运行该命令的进程,并且由于signal方法在fork之前执行,子级和父级都捕获信号。但是exec会替换所有代码,从而覆盖信号处理程序。