sigsuspend的定义:http://man7.org/linux/man-pages/man2/sigsuspend.2.html
个人Note:
sigsuspend temperately replaces the calling process's signal set with its argument mask.
mask中被set了的信号则会被阻塞,进程永远都接收不到。(i.e. 若sigfillset(&mask)的话,则一个信号都收不到)。在暂时替换了当前进程的signal set后,当前进程被挂起,直到有signal(前提是没被block掉的)触发signal_handler或者把当前进程终结,才会恢复运行当前进程。
所以,多种信号如SIGINT、SIGTSTP都可以使进程停止挂起。假如我们仅仅想等待SIGCHLD信号,但同时又不想block掉SIGINT和STGTSTP信号,则只能额外加一个flag,并做如下处理:
while(!sigchld_received) {
sigsuspend(&mask);
}
...
sigchld_handler(int sig) {
...
sigchld_received = 1;
...
}
这样一来,parent进程便会一直等待,直到sigchld_handler被触发(即child进程终结或被停止)。
P.S. 当调用sigsuspend进行等待时,signal handler都是由sigsuspend函数内部调用的!(参考顶上的博文链接)
【本文是从我原来的新浪博客搬过来的笔记】