阅读 50

进程与信号(五) 健壮的信号接口


我们已经讨论了使用signal来发出与捕获信号,因为他们在较为旧的Unix程序中很常见。然而,X/Open与Unix规范推荐了一个更为健壮的用于信号处理的新的编程接口: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所做的所有事情。如果act不为空,就会设置指定信号的动作。

作为信号,如果成功,sigaction就会返回0,否则返回-1。如果指定的信号不存在或是尝试捕获或忽略不能捕获或是忽略的信号时,错误变量errno就会被设置EINVAL。

在参数act所指向的sigaction结构内部,sa_handler是一个指针,指向当接收到sig信号时所调用的函数。这与我们在前面所见到过的传递给signal的函数func相类似。我们可以在sa_handler域使用特殊值SIG_IGN与SIG_DFL分别表示要忽略此信号或是重新载入默认动作。

sa_mask域指定了一个在sa_handler函数调用之前要添加到进程的信号掩码中信号集合。有一些被屏蔽或是不会传递给进程的信号集合。这就会阻止了我们在前面所看到的在处理器函数运行完成之前接收到信号的情况。使用sa_mask域可以减少竞争条件。

然而,由sigaction所设置的处理器捕获的信号默认情况下并不会重新设置,而如要我们希望获得我们在前面所看到的信号行为,那么就必须设置sa_flags域来包含SA_RESETHAND值。在我们详细深入了解sigaction之前,让

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐