聊聊SIGCHLD信号的作用

来源:互联网 发布:阿里云域名控制台 编辑:程序博客网 时间:2024/06/10 18:04

一句话总结:子进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。

看下如何捕捉

#include <stdio.h>#include <sys/wait.h>#include <sys/types.h>#include <signal.h>#include <unistd.h>void sigFun(int sig){printf("sigFun begin\n");pid_t pid;int status;while((pid = waitpid(-1, &status, WNOHANG)) > 0){printf("catch child process, pid:%d\n", pid);}printf("sigFun end\n");return;}int main(){pid_t pid1, pid2;signal(SIGCHLD, sigFun);pid1 = fork();if (pid1 < 0)return -1;if(0 == pid1){sleep(5);printf("child sleep 5 sec\n");}else{sleep(10);printf("parent sleep 10 sec\n");}}

signal(SIGCHLD, sigFun); //表示SIGCHLD信号由函数sigFun处理。

当子进程结束后,发送SIGCHLD给父进程,此时由sigFun捕捉信号并处理。sleep中的父进程也立马被唤醒继续往下执行。


zjy@ubuntu:~/cpp$ ./main

child sleep 5 sec

sigFun begin

catch child process, pid:4426

sigFun end

parent sleep 10 sec

zjy@ubuntu:~/cpp$