您的位置:首页 > 其它

关于使用sigsuspend(sigset_t* mask)阻塞进程

2013-12-16 06:46 387 查看
sigsuspend的定义:http://man7.org/linux/man-pages/man2/sigsuspend.2.html

参考博文:http://www.tuicool.com/articles/673M3q

个人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函数内部调用的!(参考顶上的博文链接)

【本文是从我原来的新浪博客搬过来的笔记】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: