前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sigaction函数和signal函数

sigaction函数和signal函数

作者头像
全栈程序员站长
发布2022-09-01 14:37:53
1.3K0
发布2022-09-01 14:37:53
举报

大家好,又见面了,我是你们的朋友全栈君。

signal和sigaction的区别:

signal都是指以前的older signal函数,现在大多系统都用sigaction重新实现了signal函数。

1. signal在调用handler之前先把信号的handler指针恢复;sigaction调用之后不会恢复handler指针,直到再次调用sigaction修改handler指针。这样,signal就会丢失信号,而且不能处理重复的信号,而sigaction就可以。因为signal在得到信号和调用handler之间有个时间把handler恢复了,这样再次接收到此信号就会执行默认的handler。(虽然有些调用,在handler的以开头再次置handler,这样只能保证丢信号的概率降低,但是不能保证所有的信号都能正确处理)

2. signal在调用过程不支持信号block;sigaction调用后在handler调用之前会把屏蔽信号(屏蔽信号中自动默认包含传送的该信号)加入信号中,handler调用后会自动恢复信号到原先的值。

3. signal处理过程中就不能提供阻塞某些信号的功能,sigaction就可以阻指定的信号和本身处理的信号,直到handler处理结束。这样就可以阻塞本身处理的信号,到handler结束就可以再次接受重复的信号。

sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。

#include<signal.h>

intsigaction(int signo, const struct sigaction* act,struct sigaction* oact) ;

其中,参数signo是要检测或修改具体动作的信号的编号数。

若act指针非空,则要修改其动作。

若oact指针非空,则系统返回该信号的原先动作。

此函数使用下列结构:

struct sigaction {

void (*sa_handler)();/* addr of signal handler,or SIG_IGN, or SIG_DFL */

sigset_t sa_mask; /* additional signals to block */

int sa_flags; /*signal options, Table 10-5 */

} ;

当更改信号动作时,如果sa_handler指向一个信号捕捉函数(不是常数SIGIGN或SIGDFL),则sa_mask字段说明了一个信号集,在调用信号捕捉函数之前,该信号集要加到进程的信号屏蔽字中,仅当从信号捕捉函数返回时再将进程的信号屏蔽字恢复为原先值,这样,在调用信号处理程序时就能阻塞某些信号。在信号处理程序被调用时,系统建立的新信号屏蔽字会自动包括正被递送的信号。因此保证了在处理一个给定的信号时,如果这种信号再次发生,那么它会被阻塞到对前一个信号的处理结束为止。若同一种信号多次发生,通常并不将它们排队,所以如果在某种信号被阻塞时,它发生了五次,那么对这种信号解除阻塞后,其信号处理函数通常只会被调用一次。

sa_flags :信号处理选择项标志

一旦对给定的信号设置了一个动作,那么在用sigaction改变它之前,该设置就一直有效。

sigaction实例请参考下一篇博客

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141543.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档