深入研究signal和sigaction

本文详细探讨了signal()和sigaction()在处理信号时的区别,指出signal()可能导致信号丢失的问题,而sigaction()通过信号屏蔽提供了更可靠的解决方案。通过分析Linux0.11内核源码,揭示了这两个函数的内部工作原理,帮助读者理解如何在内核中设置和管理信号处理。
摘要由CSDN通过智能技术生成

信号通常使用一个无符号长整数(32位)中的比特位表示各种不同的信号。因此最多可以表示32个不同的信号。signal()和sigaction()的功能比较类似,都是更改信号原处理句柄(handler,或称为处理程序)。但signal()就是内核操作上述传统信号的方式,在某些特殊时刻可能会造成信号丢失。

之前介绍过signal()函数,signal()函数的返回值是一个无返回值且具有一个整型参数的函数指针,是默认的处理方式。并且在新句柄被调用执行过一次后,信号处理句柄又会被恢复成默认处理句柄值SIG_DFL。
在linux0.11源码中,include/signal.h文件中,默认句柄SIG_DFL和忽略处理句柄SIG_IGN的定义是:

#define SIG_DFL     ((void (*)(int))0)
#define SIG_IGN     ((void (*)(int))1)

signal()函数不可靠的原因在于当信号已经发生而进入自己设置的信号处理函数中,但在重新再一次设置自己的处理句柄之前,在这段时间内有可能又有同样的信号发生了。但是此时系统已经把处理句柄设置成默认值。因为就有可能造成信号丢失。
为了防止信号的丢失,sigaction()函数是比signal()函数更安全的选择。如果坚持要用signal(),可以在自己的信号处理函数开头再重新调用signal()函数做相同的处理。
sigaction()函数比signal()函数更可靠的原因是,在信号处理函数正在处理时,被捕捉的信号在处理期间会被自动屏蔽࿰

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值