sigset 与 signal的区别?
阅读《深刻理解UNIX系统内核》的时候,了解到了关于信号的使用。回想起以前本身用过 signal()来处理信号,可是当时实践的时候有个错误的理解:信号处理只捕获一次信号,后面的信号都没捕获到,由于没有调用个人信号处理函数。如今看来,理解错误,不是由于没捕获到,而是捕获到了,可是使用的是默认的信号处理函数处理了。程序员
SVR2的unix版本中的信号机制是不可靠的,存在不少缺陷,最重要的问题是信号的可靠传送。信号处理函数不是持久有效的,并且在执行时不会屏蔽相应信号(即在执行信号处理函数的时候,有可能收到新的信号,不屏蔽的作法是:不会阻塞新信号,会直接传递给本进程,屏蔽的作法是:若是新信号是设为阻塞的话,那么内核就会记住它,但不会马上传递给进程,当进程取消对新信号的阻塞后,信号将会由内核传递给进程,并在进程中获得处理,这容许程序员保护代码的临界区,防止来自一些信号的破坏)。在这个信号机制下,有一个signal()函数。书中有这么一段话:函数
“假设用户为一个特殊的信号设置了一个信号处理函数,当该信号发生时,内核会在调用该处理函数以前将信号的处理动做设置为默认动做。若是用户但愿捕捉信号的再次发送,则每次都必须从新设置这个处理函数。”
也就是说,使用signal()的正确方法是这样:
void sigint_handler(sig)进程int sig;程序{方法signal(SIGINT,sigint_handler);兼容……handler}阻塞main(){signal(SIGINT,sigint_handler);}
而 sigset 系统调用制定一个持久的信号处理函数,在信号发生时,不会被重置为默认处理动做。旧的 signal 调用被保留下来以便向后兼容,由 signal 指定的处理函数不是持久性的。
可是我在本身的机器上面尝试用 signal 捕获 SIGINT 信号,即使不在 sigint_handler()中再次设置信号的处理函数,下次信号到达的时候,也会调用个人信号处理函数,而不须要在信号处理函数中再次设置信号处理函数。也许是如今的版本是 SVR4或者BSD, signal 优化成了持久性吧。不过记下此文,提醒本身,之后尽可能使用sigset,少用 signal。
参考文章:sigset 与 signal的区别?
sigset 与 signal的区别?相关推荐
- Nuttx signal
Signal 基本数据结构和信号掩码说明 信号相关主要数据结构 struct sigactq {FAR struct sigactq *flink; /* Forward link */struct ...
- Java并发编程—常见面试题
建议: 学习java并发前需要先掌握JVM知识 关于下面问题档案的详细解析都在后面推荐的相关系列文章中 一.线程安全相关 1.什么叫线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果. ...
- 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)
文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...
- ①Linux简明系统编程(嵌入式公众号的课)---总课时12h
10.09 注意:这个是Linux高级编程的简明教程,是Linux应用程序的开发,而不是底层程序的开发. 内容是关于操作系统和网络编程的吗? Linux简明系统编程 〇.课程思维导图 〇.会用到的头文 ...
- 实现生产者消费者的三种方式
文章目录 wait/notify的消息通知机制 预备知识 wait/notify消息通知潜在的一些问题 notify过早通知 等待wait的条件发生变化 假死状态 wait/notifyAll实现生产 ...
- Java深入学习并发原理总结
Java 并发多线程基础总结 线程池 线程池的简介 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线 ...
- 数字IC面试经验及面试题总结(内附大厂试题)
前言 微电子这行,现在本科生出去做研发会比较难,尤其是大公司,很少招本科生去做研发,除非很优秀,读研了导师又不愿意放你出去实习,结果就是到了找工作那一步,总觉得有点心虚. 而我作为一个学酥,当找工作这 ...
- 22 - OAI rfsimulator 射频仿真- 博一
最近有朋友问我OAI的rfsimulator怎么用,我就简单举个例子分享一下:包括如何使用rfsimulator.如何新建一个自己定义的信道. OAI 的rfsimulator顾名思义是用来替代真实的 ...
- Python中signal.hilbert与fftpack.hilbert的区别
文章目录 1 代码演示 2 分析总结 在Python的scipy模块中,有两个实现希尔伯特变换计算的方式,分别为signal.hilbert与fftpack.hilbert,但是这两种方式得到的结果有 ...
最新文章
- 我也来搭android环境
- Codeforces Round #331 (Div. 2) A. Wilbur and Swimming Pool 水题
- STM32开发 -- 惯导模块开发详解
- 正则表达式在JS中的应用
- 【Alpha】事后分析
- C#反射之Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom方法介绍
- [蓝桥杯][基础练习VIP]2n皇后问题(深搜)
- python多线程同步与互斥_python多线程编程(3): 使用互斥锁同步线程
- 【Java中级篇】Dom4j解析xml数据
- python deque_python中deque类详解
- newifimini出厂固件_新路由mini固件|newifi新路由mini OS固件V3.2.1.1100 抢先版 - 极光下载站...
- How To Replace The Firefox Icon With Your Logo
- Oracle 基本查询:dual、distinct、null、between and、in、like、order by、group by、dual、as
- 上班时间应该包含交通时间
- Deeping Learning学习与感悟——《深度学习工程师》_4
- java实现一个录像大师
- 3.6计算机网络(网络层概述 电路交换 报文交换 分组交换)
- 新词发现的学习和代码
- 28岁程序员从字节退休:IT是改命的唯一出路吗?
- 不要告诉别人,你家男人看见美女就不老实