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

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

【本文是从我原来的新浪博客搬过来的笔记】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值