linux下sigaction函数,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{
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flag;
void (*sa_sigaction)(int,siginfo_t *,void *);
};
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
例子:
#include #include #include void show_handler(int sig)
{
printf("I got signal %d\n", sig);
int i;
for(i = 0; i < 5; i++) {
printf("i = %d\n", i);
sleep(1);
}
}
int main(void)
{
int i = 0;
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(1) {
sleep(1);
printf("sleeping %d\n", i);
i++;
}
}
注:
(1) 如果在信号SIGINT(Ctrl + c)的信号处理函数show_handler执行过程中,本进程收到信号SIGQUIT(Crt+\),将阻塞该信号,直到show_handler执行结束才会处理信号SIGQUIT。
(2) SA_NODEFER
一般情况下, 当信号处理函数运行时,内核将阻塞。但是如果设置了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
linux下sigaction函数,sigaction函数解析相关推荐
- linux下C语言main函数参数解析
1. linux下常见的main函数有两种形式: int main(int argc, char **argv) int main(int argc, char * argv[]) 2. 参数介绍 第 ...
- linux下的struct sigaction
工作中使用案例: struct sigaction act; act.sa_sigaction = handleSignal; act.sa_flags = SA_SIGINFO; sigemptys ...
- Linux下的内存对齐函数
在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各个函数的声明如下: int posix_memal ...
- linux uname内核,Linux下confstr与uname函数_获取C库与内核信息
Linux下confstr与uname函数_获取C库与内核信息 #include #include //uname int main(int argc, char **argv[]) { struc ...
- Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
1.exit()函数 exit(int n) 其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...
- Linux系统怎么编译sin,linux下gcc编译sin函数出错的问题
linux下gcc编译sin函数出错的问题 收藏 Q: I keep getting errors due to library functions being undefined, but I'm ...
- Linux 下调用UEFI的函数
Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...
- linux终端护眼色参数,四个 Linux 下的“护眼”软件解析
晚上熄灯后,看电脑时蓝光刺眼.推荐两个护眼软件.此外最低亮度还是觉得太亮,所以自己写一个调节工具,用一个半透明黑色的遮罩层覆盖屏幕以此"降低"亮度. Redshift Redshi ...
- linux下的常用时间函数总结
1.Unix系统一直使用两种不同的时间值:"日历时间"和"进程时间" 1.1.日历时间,日历时间是从国际标准时间公元1970年1月1日00:00:00到现在所经 ...
- linux下C转码函数:iconv使用
http://anfernee.blog.51cto.com/4828774/1240270 在linux下,如果需要将编码格式转换,可以使用iconv系列函数. 头文件: iconv.h 常用函数: ...
最新文章
- 任务流程管理,从繁杂的项目管理中解脱出来
- 浏览器检测,移动网络的在线离线及网络状态
- Linux进程命令PS用法笔记
- java技术专家学习路线图_向Java最佳专家的全球专家学习Java
- 新网卡不能绑定“旧”IP故障的解决
- MyEclipse配置Tomcat 6
- 打开excel显示php拓展名,新建xls文件提示扩展名不一致
- Linux虚拟内存管理 | 虚拟地址与物理地址映射、段错误SIGSEGV
- OpenGL学习(二)第一个OpenGL程序,绘制三角形
- Oracle数据库修改用户密码
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
- [2018.03.14 T2] 树(tree)
- 智能终端代替传统设备 手机APP离线识别车牌号
- React制作页面在线截图功能
- .jnlp 文件打开方式
- 最新XNA开发游戏“Particle Wars”--粒子之战!
- 用海伦公式计算三角形的周长与面积
- [渝粤教育] 东北大学 现代科学运算—MATLAB语言与应用 参考 资料
- 如何将最大化互信息引入到无监督域适应(UDA)任务?
- vue 上次登录时间_Vue设置长时间未操作登录自动到期返回登录页