SIGCONT
#include <signal.h> #include <stdio.h> #include <stdlib.h> void sig_chld(int signo){ printf("get signal:%d\n", signo); } int main(void){ pid_t pid; struct sigaction new_action,old_action; new_action.sa_handler=sig_chld; if(sigemptyset(&new_action.sa_mask)==-1){ printf("empty new_action.sa_mask error\n"); exit(1); } // new_action.sa_flags = SA_NOCLDSTOP; new_action.sa_flags = 0; sigaction(SIGCHLD,&new_action,&old_action); if((pid=fork())==-1){ perror("fork error"); exit(1); }else if(pid==0){ if(kill(getpid(),SIGSTOP)==-1){ exit(1); } int index = 0 ; while(1) { if (index++ > 4) { printf("child done\n"); exit(0); } printf("index:%d\n", index); sleep(1); } }else{ int i = 0; while (i++ < 100) { printf("i:%d\n", i); sleep(2); if (i == 3) { printf("send signal\n"); kill(pid,SIGCONT); } } printf("parent done\n"); } exit(0); }
result:
mutian@mutian:~/soft/compile/sparrow$ ./a.out i:1 get signal:17 i:2 i:3 send signal i:4 get signal:17 i:5 index:1 index:2 i:6 index:3 index:4 i:7 index:5 child done get signal:17 i:8 parent done
SA_NOCLDSTOP:
一般当进程终止或停止(ubuntu12.04上测试,进程恢复运行也会产生SIGCHLD信号)时都会产生SIGCHLD信号,但若对SIGCHLD信号设置了SA_NOCLDSTOP标志, 则只有当子进程终止时才产生此信号。
mutian@mutian:~/soft/compile/sparrow$ ./a.out i:1 i:2 i:3 send signal i:4 index:1 index:2 i:5 index:3 index:4 i:6 index:5 child done get signal:17 i:7 i:8 parent done

浙公网安备 33010602011771号