2012-10-15 113 views
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); 
} 
+0

当您执行fork时,您将执行命令的进程的确切副本,并且由于signal方法在fork之前执行,孩子和父母都会接收到信号。 –

+0

但exec取代所有的代码,所以信号处理程序被覆盖。 – Ahtenus

回答

3

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