Linux信号-信号集&信号屏蔽字&捕捉信号

本文探讨Linux中如何处理SIGALRM信号,包括注册自定义处理函数以避免进程终止,以及在mysleep函数结束后恢复SIGALRM的默认处理行为,确保程序的正确流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阻塞信号&捕捉信号


一. 阻塞信号

1. 信号的常见其他概念

    实际执行信号的处理动作(3种)称为信号递达;
    信号从产生到递达之间的状态,叫做信号未决;
    进程可以选择阻塞某个信号;
    被阻塞的信号产生时,将保持在未决状态,直至进程取消对该信号的阻塞,才执行递达的动作;
注意:阻塞和忽略是不同的。只要信号阻塞就不会被递达;而忽略是信号在递达之后的一种处理方式。

2. 在内核中的表示
    信号在内核中的表示示意图:

    每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指针(handler)表示处理动作。信号产生时,内核在进程控制块中设置该信号的未决标志,直至信号递达才清除该标志。 操作系统向进程发送信号就是将pending位图中的该信号对应状态位由0变为1。

    如上图,SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作;SIGINT信号产生过,但是正在被阻塞,所以暂时递达不了。虽然它的处理动作是忽略,但是未解除阻塞时不能忽略该信号,因为经常仍有机会改变处理动作后再解除阻塞;SIGQUIT信号未产生过,但是它是阻塞的,所以一旦该信号产生它就被阻塞无法递达,它的处理动作也是用户自定义函数。
    在Linux下,如果进程解除某信号的阻塞之前,该信号产生了很多次,它的处理方法是:若是常规信号,在递达之前多次产生只计一次;若是实时信号,在递达之前产生多次则可以放在一个队列里。 本文只讨论常规信号,下面提到的信号都是常规信号。


3. 信号集
        
        从上图我们可以知道,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次。同样的,阻塞标志也是这样表示的。所以阻塞和未决标志我们可以采用相同的数据类型sigset_t来存储,sigget_t称为 信号集

        这个类型可以表示每个信号的“有效”、“无效”状态。在未决信号集中,“有效”、 “无效”表示该信号是否处于未决状态; 在阻塞信号集中,“有效”、 “无效” 表示该信号是否被阻塞。阻塞信号集也叫做当前进程的信号屏蔽字

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值