sigaction函数的使用和优点

NAME
       sigaction, rt_sigaction - examine and change a signal action

SYNOPSIS
       #include <signal.h>
       

       int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);


signum: 所要操作的信号
act:    对signum信号要注册的新的行为
oldact: signum信号旧的行为

struct sigaction结构体原型:

       struct sigaction {
       	/*
       	响应函数 多信号共用,避免重入现象
       	sa_handler:指定信号捕捉后的处理函数名(即注册函数)。也可赋值为SIG_IGN表忽略 或 SIG_DFL表执行默认动作;
       	*/
           void     (*sa_handler)(int); 
           void     (*sa_sigaction)(int, siginfo_t *, void *);//三参响应函数,sa_sigaction    同样可以多信号共用,siginfo_t 信号来源识别

		/*
		调用信号处理函数时,所要屏蔽的信号集合(信号屏蔽字)。
		注意:仅在处理函数被调用期间屏蔽生效,是临时性设置
		*/
           sigset_t   sa_mask; //需要阻塞的其他信号集合
         /*
         sa_flags:通常设置为0,表示用默认属性。
         默认属性即为:sa_mask中将自己屏蔽,即该信号的注册函数执行期间,再次向进程发送该信号,        
         该信号不能递达,处于未决状态。
         SA_NOCLDWAIT属性,阻止子进程变成僵尸状态,从而免去收僵尸的麻烦
         SA_SIGINFO:当信号处理函数为3参的函数时要加上
         多个参数之间用 | 实现共用
         */
           int        sa_flags; //特殊要求
          
         /* 基本不被使用 */
           void     (*sa_restorer)(void);
       };

sigaction()相对于signal()的优点:

signal()函数当多个信号共用一个信号处理函数的时候,可能会发生重入,导致段错误。sigaction()可以在响应一个信号的时候,将其他信号阻塞。

signal()函数不能指定接收信号来源, sigaction()用3参的形式可以区别信号的来源,从而决定操作哪边的信号;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值