【Linux系统编程】signal与sigaction

#include <signal.h>       

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);
 

sighandler_t参数是一个无返回值,参数为int的函数指针。

signum参数代表多少号信号。 

man手册中的解释:

signal() 的行为因 UNIX 版本而异,并且还具有历史上不同版本的 Linux 各不相同。 避免其使用:改用 sigaction(2)。 请参阅下面的可移植性。

signal() 将信号符号的处置设置为处理程序,要么是SIG_IGN,要么是SIG_DFL,要么是程序员的地址-定义的函数(“信号处理程序”)。

如果信号符号被传递到进程,则其中一个发生以下情况:

* 如果配置设置为 SIG_IGN,则信号为忽视。

* 如果处置设置为 SIG_DFL,则默认操作与信号(见信号(7))相关的发生。

上面的SIG_IGN与SIG_DFL是一个宏,可以看下图

他们分别把0和1强转成函数指针了,所以说他们俩并不是真正的处理函数,而是系统定义的识别码,设置以后出现该信号就执行系统的处理方案。这也就应了图片中第一行的Fake signal functions. 

注意下面图片中被框起来那句描述, 

SIGKILL和SIGSTOP信号的处理方式无法被设置为SIG_IGN,所以用户使用signal函数无法操作这两个信号 。

signal函数只能捕捉信号,并设置信号处理方式,但是不能获取信号的其他信息。

sigaction函数相当于加强版的signal函数,它利用了结构体放着信号处理函数以及其他信息,如下图

signum是信号,const struct sigaction *act用于设置当前进程信号的处理方式,struct sigaction *oldact是一个输入性参数,用于获取原先的sigaction参数信息。

可以看到sigaction结构体里面有五个成员,

1、2号成员都是信号处理方式,当sa_flags设置为0时使用sa_handler函数,设置为SA_SIGINFO时使用sa_sigaction函数。

sa_mask定义一组信号,在调用信号处理函数时将阻塞该组信号(不光阻塞当前信号),不允许它们中断此处理器程序的执行。(如何设置请看信号-信号集操作函数

sigaction()的功能是为信号指定相关的处理函数,但是它在执行信号处理函数时,会把当前信号加入到进程的信号屏蔽字中,从而防止在进行信号处理期间信号丢失。详情请看信号-内核态与用户态


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值