1,在linux下,父进程的信号处理函数能被子进程继承,如果在父进程设置了catch SIGCHLD的信号处理函数,那么如果子进程创建了子进程,叫做孙子进程,那么孙子进程的终止会由子进程捕捉。但如果子进程先于孙子进程终止,在孙子进程终止时,父进程不会感知到它,因为在子进程终止时,系统会自动将孙子进程的父进程设置为init进程。
2,由终端产生的信号,如SIGINT(ctrl+C),会发送给和该终端相关的所有前台进程,这意味着,如果设置信号函数捕捉SIGINT,那么父子进程会都去捕捉SIGINT一次,总共会捕捉到2次信号。
测试代码如下:
set_sig_handler(),是我自己封装的类似于signal的函数,在utility.h中声明。
#include "utility.h"
void child_handler(int signo)
{
pid_t pid=wait(NULL);
if(signo==SIGCHLD)
printf("%d exit.\n",pid);
}
void sigint_handler(int signo)
{
if(signo==SIGINT)
printf("%d get SIGINT.\n",getpid());
}
int main()
{
pid_t pid=fork();
set_sig_handler(SIGCHLD,child_handler);
set_sig_handler(SIGINT,sigint_handler);
if(pid>0)
{
for(;;)
{
pause();
printf("%d get a signal.\n",getpid());
}
}
else if(pid==0)
{
pid_t cpid=fork();
if(cpid>0)
{
for(;;)
{
pause();
printf("%d get a signal.\n",getpid());
}
}
else if(cpid==0)
{
sleep(5);
exit(0);
}
else
{
perror("fork");
exit(-1);
}
}
else
{
perror("fork");
exit(-1);
}
}