【发布时间】:2012-10-15 14:03:00
【问题描述】:
据我了解,发送给父进程的信号不应发送给子进程。那么在下面的示例中,为什么 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 之前执行,因此子进程和父进程都会捕获信号。
-
但是 exec 替换了所有代码,因此信号处理程序被覆盖。