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 一般情况下, 当信号处理函数运行时,内核将阻塞<该给定信号 -- SIGINT>。但是如果设置了SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号。 SA_NODEFER是这个标记的正式的POSIX名字(还有一个名字SA_NOMASK,为了软件的可移植性,一般不用这个名字)
SA_RESETHAND 当调用信号处理函数时,将信号的处理函数重置为缺省值。 SA_RESETHAND是这个标记的正式的POSIX名字(还有一个名字SA_ONESHOT,为了软件的可移植性,一般不用这个名字)
(3) 如果不需要重置该给定信号的处理函数为缺省值;并且不需要阻塞该给定信号(无须设置sa_flags标志),那么必须将sa_flags清零,否则运行将会产生段错误。但是sa_flags清零后可能会造成信号丢失!
sigaction
sigaction(查询或设置信号处理方式) 相关函数 signal,sigprocmask,sigpending,sigsuspend, sigemptyset 表头文件 #include 定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact); 函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。 如参数结构sigaction定义如下 struct sigaction { union{ __sighandler_t sa_handler; void (*_sa_sigaction)(int,struct siginfo *, void *); }_u sigset_t sa_mask; unsigned long sa_flags; void (*sa_restorer)(void); } 信号处理函数可以采用void (*sa_handler)(int)或void (*sa_sigaction)(int, siginfo_t *, void *)。到底采用哪个要看sa_flags中是否设置了SA_SIGINFO位,如果设置了就采用void (*sa_sigaction)(int, siginfo_t *, void *),此时可以向处理函数发送附加信息;默认情况下采用void (*sa_handler)(int),此时只能向处理函数发送信号的数值。 sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。 sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。 sa_restorer 此参数没有使用。 sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。 sa_falgs还可以设置其他标志: SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL ··SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用 SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号 sigaction
sigaction()
示例
#include static void int_hander(int s)
{
printf("Catch a signal sigint\n");
} int main(void) { int i; struct sigaction act, oact; act. sa_handler = int_hander; sigemptyset(&act. sa_mask); //清空此信号集 act. sa_flags = 0; sigaction(SIGINT, &act, &oact); //signal(SIGINT, SIG_IGN); while(1){ for(i=0; i<5; i++){ write(1, ".", 1); sleep(1); } write(1, "\n", 1); } sigaction(SIGINT, &oact, NULL); //恢复成原始状态 return 0; }
sigaction函数的使用相关推荐
- sigaction 函数,sigemptyset()函数,fcntl()函数,isatty()函数
第一个函数:使用 sigaction函数: signal 函数的使用方法简单,但并不属于POSIX标准,在各类UNIX平台上的实现不尽相同,因此其用途受 到了一定的限制.而 POSIX标准定义的信号处 ...
- sigaction函数解析
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作). 他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该 ...
- UNIX环境编程学习笔记(25)——信号处理进阶学习之 sigaction 函数
lienhua34 2014-11-05 sigaction 函数跟 signal 函数一样,用于设置信号处理函数.此函数是用于取代 UNIX 早期版本使用的 signal 函数.UNIX 早期版本的 ...
- sigaction函数使用实例
sigaction函数 (1)sigaction函数原型 sigaction函数用来查询和设置信号处理方式,它是用来替换早期的signal函数.sigaction函数原型及说明如下: sigactio ...
- Linux 进程学习(四)------ sigaction 函数
转自:http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函数: signal 函数的使用方法 ...
- 信号的捕捉与sigaction函数
一.内核如何实现信号的捕捉 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 1. 用户程序注册了SI ...
- 信号、signal 函数、sigaction 函数
文章目录 1.信号的基本概念 2.利用 kill 命令发送信号 3.信号处理的相关动作 4.信号与 signal 函数 4.1 signal 函数示例一 4.2 signal 函数示例二 5.利用 s ...
- 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- sigaction函数中关于sa_mask的解释
使用 man sigaction 查看手册,对sa_mask的描述是这样的: sa_mask specifies a mask of signals which should be bloc ...
- linux sigaction函数 sa_flags的值
开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 ...
最新文章
- Calling Oracle stored procedures from Microsoft.NET
- mysql的delete的底层实现_MySQL索引的底层实现
- c语言农夫过河游戏代码解释,农夫过河C++代码
- 自适应滤波实例之系统辨识
- python torch exp_学习Pytorch过程遇到的坑(持续更新中)
- web前端的渐进增强式开发模型
- java数组比较的头文件_Java和C++的数组比较
- 读《大道至简》第四章有感
- spark 把一列数据合并_Spark DataFrame列的合并与拆分
- 2010年,您还不“工作流”吗?
- vue项目中出现cannot get/的解决办法
- 交换机设备登录账号权限1_Stelnet(ssh)登陆华为交换机配置教程
- 高清优质PPT模板20篇下载(金融投资系列)
- 笔记本键盘进水失灵,禁用方法
- android studio 初始化项目加载时间过长或失败问题解决
- 包干到户是最好的软件项目管理方法
- 什么,3行Python代码就能获取海量数据?
- Java实现包含多级目录文件的筛选删除操作
- Hadoop3.x集群搭建及配置的完整操作流程
- 中式英语之鉴读书笔记(上)
热门文章
- VE对环境和社会的贡献
- html数组删除指定元素,JS实现数组删除指定元素功能示例
- 视觉SLAM十四讲第十讲
- 证件识别OCR技术特点
- 什么耳机戴着舒服耳朵不疼?不塞耳道的骨传导耳机
- VS code内置浏览器插件-Preview on Web Server
- 糯米团—重制“iPhone团购信息客户端”(四)
- java模拟电脑体育彩票的随机选号_利用JS来模拟体育彩票选号器
- visual basic自定义排序
- 国产工业软件做的如何?