C 同时发送给子进程和父进程的信号
据我所知,发送给父进程的信号不应该发送给子进程。那么,为什么在下面的示例中,SIGINT同时到达子级和父级呢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)
#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会替换所有代码,从而覆盖信号处理程序。