函数函数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,一经查实,立即删除!

相关文章

使用SQL Server连接xml接口,读取并解析数据

--数据源格式&#xff0c;放到任意程序中部署接口即可--<Data xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd"http://www.w3.org/2001/XMLSchema"> --<Peoples> --<People> --<Name>张三</Name> --<S…

mac 卸载编辑器卸不干净

Configuration~/Library/Preferences/Caches~/Library/Caches/Plugins~/Library/Application Support/Logs~/Library/Logs/转载于:https://www.cnblogs.com/smzd/p/10114540.html

vue中使用axios最详细教程

前提条件&#xff1a;vue-cli 项目 安装&#xff1a; npm npm 在main.js导入&#xff1a; // 引入axios&#xff0c;并加到原型链中 import axios from axios; Vue.prototype.$axios axios; import QS from qs Vue.prototype.qs QS;封装好的axios,拿走不送&#xff1a;&am…

Java 类型转换String,List,Map,Array

1. JsonString转为Map String jsoNStr "{\n" "\t\"TestArray\": [\"1\", \"2\", \"3\"]\n" "}";Map map JSON.parseObject(jsoNStr,Map.class);2.Object转为JsonArray(得保证obj是个Array数组&#x…

关于固件

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

React-Native 指定模拟器RUN-IOS

react-native run-ios --simulator "iPhone 7” 转载于:https://www.cnblogs.com/smzd/p/10185263.html

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…

goland 实用键

代码补全 option command v转载于:https://www.cnblogs.com/smzd/p/10313417.html

关于Mysql java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的问题...

问题所在&#xff1a; 1.连接数据库一个是密码是否正确&#xff0c; 2.driver是否对&#xff0c; 3.有么有jar包冲突&#xff0c;转载于:https://www.cnblogs.com/java-123/p/9403412.html

vscode配置vue环境

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

秒杀核心设计(减库存部分)-防超卖与高并发

商品详情页面的静态化&#xff0c;varnish加速&#xff0c;秒杀商品库独立部署服务器这种就略过不讲了。只讨论库存部分的优化 mysql配置层面的优化可以参考我的这篇文章 《关于mysql innodb引擎性能优化的一点心得》 重点设计在数据库层面。 2张表&#xff1a; 第一张&#xf…

go strconv

strconv是golang用来做数据类型转换的一个库。 介绍下strconv最常用的两个方法, 没有解释语言那么自在可以str(int),int(string), 那还算简练。 num, err : strconv.Atoi("-42") str : strconv.Itoa(-42)转换换成bool类型. b, err : strconv.ParseBool("true&qu…

django配置templates、static、media和连接mysql数据库

1.模板文件 # templates配置 if os.path.exists(os.path.join(BASE_DIR, templates)) is False:os.mkdir(os.path.join(BASE_DIR, templates)) TEMPLATES [{# 模板引擎&#xff0c;内置的模板引擎有&#xff1a;# 1. django.template.backends.django.DjangoTemplates# 2. dj…

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 …

web开发:jquery之DOM

一、文档结构 二、文档操作 三、文档操作案例 四、form表单 五、正则 六、form案例 一、文档结构 jsvar $sup $(.sup);console.log($sup.children()); // 子们console.log($sup.parent()); // 父console.log($sup.prev()); // 上兄弟console.log($sup.next()); // 下兄弟c…

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&#…

Http请求报头设置(C#)

1、添加一个SetHeaderValue方法&#xff1a; public static void SetHeaderValue(WebHeaderCollection header, string name, string value) { var property typeof(WebHeaderCollection).GetProperty("InnerCollection",BindingFlags.Instance | BindingFlags.NonP…

vue-cli3使用cdn引入

1. index.html引入&#xff1a; <script src"https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"></script> <script src"https://cdn.bootcss.com/moment.js/2.20.1/locale/zh-cn.js"></script>2. vue.config.js配置&…