信号:signal以及sigaction

3 篇文章 0 订阅

程序可以使用signal库函数来处理信号,定义如下:

#include <signal.h>
void  (*signal(int sig,void (*func)(int)))(int);

其中参数sig给出准备捕获或者忽略的信号,而接收到信号后需要调用的函数则由参数func给出。
信号处理函数也可以使用以下两个特殊值

SIG_IGN     忽略信号
SIG_DFL     恢复默认行为

现在较多用的不是signal,而是sigaction。定义如下:

#include<signal.h>
int sigaction(int sig,const struct sigaction *act ,struct sigaction *oact)

sigaction 的结构定义同样在文件signal.h 中 。他的作用是定义在接收到参数sig制定的信号后应该采取的行动。
该结构至少应该包括以下几个成员:

void (*)(int)sa_handler     /*function,SIG_DFL OR SIG_IGN
sigset_t sa_mask        /*signals to block in sa_handler
int sa_flags            /*signal action modifiers

sigaction 函数设置与信号sig 关联的动作。如果oact不是空指针,则sigaction将把原先对该信号的动作写道它指向的位置。如果act是空指针,则sigaction函数就不需要做其他设置,否则将在该参数中设置对指定信号的动作。
与signal函数一样,sigaction函数成功时返回0,失败是返回-1,如果给出信号无效或者对不允许捕获或者忽略的信号进行捕获或者忽略,则会设置错误变量errno为EINVAL。
在参数act只想的sigaction结构中,sa_handler为函数指针,类似于signal中的func,同样可以设置为SIG_IGN 与SIG_DFL。
sigaction的成员中,sa_mask制订了一个信号集,这里面保存的是将会被屏蔽的信号。
信号集的类型名为sigset_t,以及一系列处理信号集的函数:

#include <signal.h>
int sigaddset(sigset_t *set,int signo);     /*添加给定的信号
int sigemptyset(sigset_t *set);         /*初始化信号集为空
int sigfillset(sigset_t *set);          /*初始化信号集为所有以定义的信号
int sigdelset(sigset_t *set,int signo);     /*删除给定的信号
int sigismember(sigset_t *set ,int signo);  /*判断是否是信号集成员
int sigprocmask(int how, const sigset_t *set ,sigset_t *oset);

最后那个sigprocmask函数比较复杂,它将根据how参数来修改进程的信号屏蔽字,新的信号屏蔽字由参数set(如果非空)给出,而原先的则会保存到oset中。如果set为空,则此函数唯一目的为将现在的信号屏蔽字保存到oset中。
how的集中取值由下表给出:

SIG_BLOCK   |   把参数set中的信号添加到信号屏蔽字中
SIG_SETMASK |   把信号屏蔽字设置为参数set中的信号
SIG_UNBLOCK |   从信号屏蔽字中删除参数set中的信号

对于这里的信号屏蔽字作一点简单说明:
这里的信号屏蔽就是指来了信号,先不传递给当前进程,但是信号仍然停留在待处理状态,一旦unblock,则信号会重新到达。
程序可以通过调用函数sigpending来查看它阻塞的信号中有哪些正停留在待处理的状态。

int sigpending(sigset_t *set);

此函数将会把停留在待处理状态的信号写道参数set指定的信号集中。 如果程序需要处理信号,又需要控制信号处理函数的调用时间即可使用上这个函数。
sigaction中有一个可以更好的实现pause函数的函数。

int sigsuspend (const sigset_t *sigmask);

此函数会将进程的屏蔽字替换为sigmask给出的信号集,然后挂起程序的执行。当捕捉到一个信号后,首先执行信号处理程序,然后从sigsuspend返回,最后将信号屏蔽字恢复为调用sigsuspend之前的值。如果收到的信号结束了程序,则suspend就不会返回,如果没有终止程序,则会返回-1,并将errno设置为EINTR。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值