代码文件test.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <signal.h>
void handler(int signo){
printf("i receive a sig,sig number is %d\n",signo);
}
int signal_handler(){
struct sigaction act;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
act.sa_handler=handler;
if(sigaction(SIGTERM,&act,NULL)<0){
return 1;
}
return 0;
}
int main()
{
int pid= fork();
int ret;
if(pid<0){
printf("fork error\n");
return -1;
}else if(pid==0){
//child process
int i=0;
while(1)
i++;
}else{
//parent process
signal_handler();
int status;
ret=waitpid(pid,&status,0);
if(pid==ret){
printf("child process exited with status %d\n",status);
}else if(ret==-1){
if(errno==EINTR)
printf("waiting for child process interruptd\n");
}
}
return 0;
}
编译:
gcc -o fc test.c
执行 :
./fc
当我们使用kill 23048 来杀掉父进程的时候,结果如下:
结论:
在父进程使用waitpid 等待子进程结束的时候,如果父进程注册了一些信号处理,某个时候,父进程收到一个信号,父进程会去执行信号处理函数,waitpid函数会被打断。