函数函数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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于固件

固件(Firmware)就是写入EROM或EPROM(可编程只读存储器)中的程序&#xff0c;通俗的理解就是“固化的软件”&#xff0c;台港澳称为“韧体”。更简单的说&#xff0c;固件就是BIOS的软件&#xff0c;但又与普通软件完全不同&#xff0c;它是固化在集成电路内部的程序代码&#x…

vue和element-ui使用

上一篇已经创建好一个vue项目。https://mp.csdn.net/postedit/80926242 这一篇主要是创建一个vue项目并结合饿了么框架element-ui。 1.先创建vue项目&#xff0c;我准备把项目放在e盘下&#xff1a;E:\Work\RegisterProject&#xff1b; 命令行进入这个目录&#xff1a; 创…

javaweb学习6——自定义标签

声明&#xff1a;本文只是自学过程中&#xff0c;记录自己不会的知识点的摘要&#xff0c;如果想详细学习JavaWeb&#xff0c;请到孤傲苍狼博客学习&#xff0c;JavaWeb学习点此跳转 本文链接&#xff1a;https://www.cnblogs.com/xdp-gacl/p/3916946.html https://www.cnblogs…

vscode配置vue环境

一、安装VSCode、NodeJS VSCode&#xff1a;https://code.visualstudio.com/ NodeJS&#xff1a;https://nodejs.org/en/ 二、打开VSCode&#xff0c;安装常用插件 如图所示&#xff08;安装后重新加载即可&#xff09;: 三、项目中添加.vscode文件夹&#xff0c;文件夹中添…

vue调用顺序(初学版) index.html → main.js → app.vue → index.js → components/组件 测试

关于它是怎么调用运作的&#xff1a;https://mp.csdn.net/postedit/86134414 一. 准备工作&#xff1a; 1.下载webstorm&#xff0c;安装vue。 2.创建项目&#xff0c;cd到要放项目的文件夹下 vue init webpack vue_test 3.安装各种包 npm install 4.运行 cd vue_test …

NO.8:自学python之路------并行socket网络编程

摘要 一到放假就杂事很多&#xff0c;这次的作业比较复杂&#xff0c;做了一个周&#xff0c;进度又拖了。不过结果还不错。 正文 粘包 在上一节中&#xff0c;如果连续发送过多数据&#xff0c;就可能发生粘包。粘包就是两次发送的数据粘在一起被接收&#xff0c;损坏了数据的…

vue项目中主要文件的加载顺序(index.html、App.vue、main.js)

先后顺序&#xff1a; index.html > App.vue的export外的js代码 > main.js > App.vue的export里面的js代码 > Index.vue的export外的js代码 测试的页面代码块&#xff1a; 文件的加载先后顺序&#xff1a; Index.vue的mounted()中的输出没有执行。why&#…

凸包算法

转载自&#xff1a;https://blog.csdn.net/bone_ace/article/details/46239187 凸包问题的五种解法 2015年05月29日 17:58:51 阅读数&#xff1a;33660前言&#xff1a; 首先&#xff0c;什么是凸包&#xff1f; 假设平面上有p0~p12共13个点&#xff0c;过某些点作一个多边形&a…

一个优雅的占位图解决方案。适用于 UITableView 和 UICollectionView。

FMListPlaceholder 项目地址&#xff1a;https://github.com/yfming93/FMListPlaceholder 一个优雅的占位图解决方案。适用于 UITableView 和 UICollectionView。 一行代码处理空列表占位图逻辑 0x001 与其他的同类三方库对比的优点&#xff1a; 首次进入列表占位图是不显示的。…

vue中 关于$emit的用法

1、父组件可以使用 props 把数据传给子组件。 2、子组件可以使用 $emit 触发父组件的自定义事件。 vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( event, fn );//监听event事件后运行 fn&#xff1b; 例如&#xff1a;子组件&#xff1a; <template><di…

vue-transition动画

demo点击显示与消失 <div id"demo"><button v-on:click"show !show">Toggle</button><transition name"fade"><p v-if"show">hello</p></transition> </div> <script> new V…

Java String:重要到别人只能当老二的字符串类

字符串&#xff0c;是Java中最重要的类。这句肯定的推断不是Java之父詹姆斯高斯林说的&#xff0c;而是沉默王二说的&#xff0c;因此你不必怀疑它的准确性。 关于字符串&#xff0c;有很多的面试题&#xff0c;但我总觉得理论知识绕来绕去没多大意思。你比如说&#xff1a;Str…

Java基础教程:多线程基础(3)——阻塞队列

Java基础教程&#xff1a;多线程基础&#xff08;3&#xff09;——阻塞队列 快速开始 引入问题 生产者消费者问题是线程模型中的经典问题&#xff1a;生产者和消费者在同一时间段内共用同一存储空间&#xff0c;生产者向空间里生产数据&#xff0c;而消费者取走数据。 模拟情景…

001.Linux开机启动过程

相关Linux启动过程解析&#xff0c;此作为通用启动参考&#xff1a; 转载于:https://www.cnblogs.com/itzgr/p/10285833.html

【01】《正则表达式必知必会》(已看)(仅存放)

【01】《正则表达式必知必会》 共149页。扫描版&#xff0c;中文版。Sams Teach Yourselef Regular Expressions in 10 minutesBen Forta著。杨涛 翻译【】魔芋&#xff1a;这本书已经没有用了。内容已吸收。内容较为基础&#xff0c;也很全面。** 附件列表 链接&#xff1a;ht…

什么是高并发,如何避免高并发

之前我将高并发的解决方法误认为是线程或者是队列可以解决&#xff0c;因为高并发的时候是有很多用户在访问&#xff0c;导致出现系统数据不正确、丢失数据现象&#xff0c;所以想到 的是用队列解决&#xff0c;其实队列解决的方式也可以处理&#xff0c;比如我们在竞拍商品、转…

到底多大才算高并发?

一、什么是高并发 定义&#xff1a; 高并发(High Concurrency)是使用技术手段使系统可以并行处理很多请求。关键指标&#xff1a; -响应时间(Response Time) -吞吐量(Throughput) -每秒查询率QPS(Query Per Second) -每秒事务处理量TPS(Transaction Per Second) -同时在…

eclipse安装maven插件

1、在线安装插件 a.打开eclipse&#xff0c;菜单“Help”-“Install New Software...” b.在Work with 地址栏输入&#xff1a;http://download.eclipse.org/releases/对应eclipse版本名称 c.在filter框中输入maven d.选择“Collaboration”-“m2e - Maven Integration for Ecl…

VS2017 网站打包发布生成的文件中包含.pdb文件,解决办法

右键点击项目属性&#xff0c;选择打包/发布 Web&#xff0c;勾选 排除生成的调试符号&#xff1a; 再次发布&#xff0c;就不会再生成.pdb文件 转载于:https://www.cnblogs.com/JoinLet/p/10297254.html

分布式学习路线

由于分布式系统所涉及到的领域众多&#xff0c;知识庞杂&#xff0c;很多新人在最初往往找不到头绪&#xff0c;不知道从何处下手来一步步学习分布式架构。 本文试图通过一个最简单的、常用的分布式系统&#xff0c;来阐述分布式系统中的一些基本问题。 负载均衡分布式缓存分…