linux 信号处理 四 (sigaction参数说明)
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); |
第二、第三个参数为,sigaction结构类型定义如下:
struct sigaction{ |
sa_handler:字段包含一个信号捕捉函数的地址
sa_mask:字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。
即执行信号处理函数期间,阻塞信号屏蔽字中的信号,执行结束后再处理这期间发生的信号(sa_mask集中的信号)。注:阻塞的意思是延迟相应信号
sa_flag :是一个选项,注意:这个选项只与sigaction函数注册的信号有关联,与sa_mask中的信号无任何关系。
SA_INTERRUPT 由此信号中断的系统调用不会自动重启 SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针 SA_NODEFER 一般情况下,当信号处理函数运行时,内核将阻塞(sigaction函数注册时的信号)。但是如果设置了SA_NODEFER标记, 那么在该信号处理函 数运行时,内核将不会阻塞该信号。 SA_RESETHAND 当调用信号处理函数时或信号处理函数结束后,将信号的处理设置为系统默认值。 |
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
例子:
#include <stdio.h>
#include <signal.h>
#include <unistd.h> void show_handler(int sig)
{
printf("I got signal %d\n", sig);
int i;
for(i = ; i < ; i++)
{
printf("i = %d\n", i);
sleep();
}
} int main(void)
{
int i = ;
struct sigaction act, oldact;
act.sa_handler = show_handler;
sigaddset(&act.sa_mask, SIGQUIT); //见注(1)
act.sa_flags = SA_RESETHAND | SA_NODEFER; //见注(2)
//act.sa_flags = 0; //见注(3) sigaction(SIGINT, &act, &oldact);
while()
{
sleep();
printf("sleeping %d\n", i);
i++;
}
}
注:
(1) 如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。
(2) SA_NODEFER 一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)
SA_RESETHAND 当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)
(3) 如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成信号丢失!
http://webcache.googleusercontent.com/search?q=cache:B2HsD1Zf2f8J:hi.baidu.com/operationsystem/blog/item/bb215411f4dc61f4c2ce79e6.html/cmtid/c150423c8b8feae13d6d97b0+sigaction&cd=1&hl=zh-CN&ct=clnk
最新文章
- IT雇员及外包商选择:人品第一
- 转!!java事务的处理
- 在浏览器的JavaScript里new Date().toUTCString()后,传递给C# DateTime().TryParse()会发生什么?
- ch02-HTML的基本概念
- POJ3087 Shuffle&#39;m Up 简单模拟
- Java编写ArrayBasic制作一个简单的酒店管理系统
- hive函数总结-日期函数
- 筛法求质——poj2262&;2909
- 原生js选项卡
- Android库项目中的资源ID冲突
- 重写(override)和重载(overload)的区别
- go安装依赖包
- onload事件与ready事件的区别,原生js与jquery的区别
- 【Linux常见问题】Centos7的网络配置问题
- 【mybatis基础】mybatis开发dao两种方法
- 嵌入式开发之hi3519---spi nor flash启动
- nginx_lua_waf 部署、测试记录
- Windows下安装MySQL详细教程
- Spring Boot 中 Controller 使用
- 怎样检查fragmentation
热门文章
- ehlib 安装
- apscheduler -定时任务
- PyQt5编程:鼠标事件
- 利用security.js实现RSA加密
- UI基础:UILabel.UIFont 分类: iOS学习-UI 2015-07-01 19:38 107人阅读 评论(0) 收藏
- 升级 macOS Mojave 后部分软件 (如 VS Code) 字体变虚的解决方法
- mkbootimg hacking
- [LeetCode&;Python] Problem 461. Hamming Distance
- Linux Shell查看物理CPU个数、核数、逻辑CPU个数
- CTF-练习平台-WEB之 web2