函数函数sigaction、signal
函数函数sigaction
1. 函数sigaction原型:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
分析:
- 参数 signum :要捕获的信号。
- 参数act:truct sigaction 结构体,后面具体讲解传入参数,新的处理方式
- 参数oldact:返回旧的 struct sigaction 结构体,传出参数,旧的处理方式
1.2 struct sigaction 结构体
1 struct sigaction 2 { 3 void(*sa_handler)(int); 4 void(*sa_sigaction)(int, siginfo_t *, void *); 5 sigset_t sa_mask; 6 int sa_flags; 7 void(*sa_restorer)(void); 8 };
分析:
- sa_handler : 不带附加参数的信号处理函数指针
- sa_sigaction: 带有附加参数的信号处理函数指针(两个信号处理函数指针只能二选一)
- sa_mask: 在执行信号处理函数时,应该屏蔽掉哪些信号
- sa_flags: 用于控制信号行为,它的值可以是下面选项的组合。
- SA_SIGINFO:如果指定该选项,则向信号处理函数传递参数(这时应该使用 sa_sigaction 成员而不是 sa_handler).
- sa_restorer:该成员在早期是用来清理函数栈的,如今已被废弃不用。
注意:sa_flags 的选项比较多,大部分可又自己做实验验证,有些是需要额外的知识,比如 SA_ONESTACK 和 SA_RESTART,这些放到后面讲解。本节示例中,只需要把 sa_flags 设置为 0 即可。
信号捕捉特性:
- 进程正常运行时,默认PCB有一个信号屏蔽字,假定为☆,它决定了进程自动屏蔽哪些信号,当注册了某个信号步捕捉函数,捕捉到该信号以后,要调用该函数,而该函数有可能执行很长时间,在这期间所屏蔽的信号不由☆指定,而由sa_mask来指定,调用完信号处理函数,再恢复为☆。
- xxx信号捕捉函数执行期间,XXX信号自动屏蔽。
- 阻塞的常规信号不支持排队,产生多次只记录一次(后32个实时信号支持排队)
1. 测试代码:
1 #include<stdio.h> 2 #include<signal.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 6 void docatch(int signo) 7 { 8 printf("%d signal is catch\n", signo); 9 } 10 11 int main() 12 { 13 int ret; 14 struct sigaction act; 15 act.sa_handler = docatch; 16 sigemptyset(&act.sa_mask); 17 sigaddset(&act.sa_mask, SIGQUIT); 18 act.sa_flags = 0; //默认属性:信号捕捉函数执行期间,自动屏蔽本信号 19 ret = sigaction(SIGINT, &act, NULL); 20 if(ret < 0) 21 { 22 perror("sigaction error"); 23 exit(1); 24 } 25 while(1) 26 sleep(1); 27 return 0; 28 }
输出结果:
2. 测试代码:
1 #include<stdio.h> 2 #include<signal.h> 3 #include<stdlib.h> 4 #include<unistd.h> 5 6 void docatch(int signo) 7 { 8 printf("%d signal is catch\n", signo); 9 sleep(10); 10 printf("--------------finish-\n"); 11 } 12 13 int main() 14 { 15 int ret; 16 struct sigaction act; 17 act.sa_handler = docatch; 18 sigemptyset(&act.sa_mask); 19 sigaddset(&act.sa_mask, SIGQUIT); 20 act.sa_flags = 0; 21 ret = sigaction(SIGINT, &act, NULL); 22 if (ret < 0) 23 { 24 perror("sigaction error"); 25 exit(1); 26 } 27 while (1) 28 sleep(1); 29 return 0; 30 }
输出结果:
3. 测试代码:
1 #include <unistd.h> 2 #include <signal.h> 3 #include <stdio.h> 4 5 void printsigset(const sigset_t *set) 6 { 7 for (int i = 1; i <= 64; i++) 8 { 9 if (i == 33) putchar(' '); 10 if (sigismember(set, i) == 1) 11 putchar('1'); 12 else 13 putchar('0'); 14 } 15 puts(""); 16 } 17 18 void handler(int sig) 19 { 20 if (sig == SIGTSTP) 21 printf("hello SIGTSTP\n"); 22 if (sig == SIGINT) 23 printf("hello SIGINT\n"); 24 sleep(5); 25 sigset_t st; 26 sigpending(&st); 27 printsigset(&st); 28 } 29 30 int main() 31 { 32 printf("I'm %d\n", getpid()); 33 struct sigaction act, oldact; 34 act.sa_handler = handler; // 设置普通信号处理函数 35 sigemptyset(&act.sa_mask); // 向 sa_mask 中添加 SIGINT 36 sigaddset(&act.sa_mask, SIGINT); 37 act.sa_flags = 0; // 先置 0 38 39 sigaction(SIGTSTP, &act, &oldact); 40 sigaction(SIGINT, &act, &oldact); 41 42 while (1) 43 { 44 write(STDOUT_FILENO, ".", 1); 45 pause(); 46 } 47 return 0; 48 }
输出结果:
分析:
- 当程序运行的时候,Ctrl C 进入 handler,然后立即 Ctrl Z 发现 handler 还未执行完就被 SIGTSTP 打断.
- 当程序运行的时候,Ctrl Z 进入 handler,然后立即 Ctrl C 发现并不会被 SIGINT 打断,这是因为该 handler 注册的时候被设置了 SA_MASK = SIGINT。最后 handler 结束的时候打印了未决信号集,发现里头有 SIGINT。所以 handler 结束后,又去继续对 SIGINT 进行处理。
转载于:https://www.cnblogs.com/sunbines/p/10265659.html
函数函数sigaction、signal相关推荐
- 信号、signal 函数、sigaction 函数
文章目录 1.信号的基本概念 2.利用 kill 命令发送信号 3.信号处理的相关动作 4.信号与 signal 函数 4.1 signal 函数示例一 4.2 signal 函数示例二 5.利用 s ...
- 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数
信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...
- Linux信号signal介绍,sigaction结构体,signal()函数,sigaction()函数
信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号).应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉.进程收到一 ...
- linux下sigaction函数,Linux sigaction函数 sa_flags的值
开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include 2 #include 3 #include 4 #include 5 6 void show_han ...
- Linux信号sigaction / signal
Linux信号sigaction / signal 文章目录 Linux信号sigaction / signal 目的 函数原型 struct sigaction 信号枚举值 ISO C99 sign ...
- Dart —— 函数 函数参数 匿名函数
Dart汇总请点击这里 函数 文章目录 函数 可选参数 命名可选参数 位置可选参数 默认参数值 main() 函数 函数是一等对象 匿名函数 返回值 Dart 是一门真正面向对象的语言, 甚至其中的函 ...
- jquery jQuery的入口函数 $函数 dom对象和jquery对象
文章目录 jquery jQuery的入口函数 $函数 dom对象和jquery对象 jQuery的入口函数 视频 代码 $函数 视频 代码 dom对象和jquery对象 视频 代码 jquery j ...
- python在匿名函数作和_跟光磊学Python开发-匿名函数函数和高阶函数
跟光磊学Python开发-匿名函数函数和高阶函数 跟光磊学Python开发-匿名函数函数和高阶函数跟光磊学Python开发 匿名函数 匿名函数就是函数定义时没有名字的函数,也称为匿名表达式. 普通函数 ...
最新文章
- TCP和UDP DNS DHCP OSPF的五种包:
- 低代码公司黑帕云被字节跳动收购:潮水褪去,曾经爆火的低代码赛道迎来变局?...
- 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
- 解决ajax劫持,Ajax实现检测网站劫持的方法
- python常用内置函数汇总_太全了!Python3常用内置函数总结
- 导致View树遍历的时机
- nodejs接收post数据
- mongoose $sum
- 52. N-Queens II (Array; Back-Track)
- 听写英语单词的小程序
- 普通话测试-短文60篇文章,附带拼音(21-30篇)
- JS学习之路系列总结四象阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)
- 关于echarts人物关系图,节点展现为图片
- 影像分析器之:波形示波器
- 服务器打不井根目录下的文件,服务器共享文件夹的使用方法.docx
- 7-6 谁是凶手 (100 分)
- 连续加班后的一些感想
- SUST Weekly Final Round One 参考题解
- 接口VGA、DVI、HDMI、DP详解
- 用Python助女神发朋友圈
热门文章
- [机器学习]超参数优化算法-SuccessiveHalving与Hyperband
- STM32开发板入门教程(十三) - SPI模式读写SD卡
- 注意!这些行为将会影响征信
- 空间谱专题12:二维测向的基本方法
- 没有工作怎么申请贷款?
- 《城邦暴力团》:一部奇书、反书、隐书
- Photoshop图层学习总结
- matlab教程点语言,编程语言 / Matlab教程_电脑教程学习网( 5 )
- java treeset subset_Java中TreeSet的详细用法
- mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...