阅读《深刻理解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的区别?相关推荐

  1. Nuttx signal

    Signal 基本数据结构和信号掩码说明 信号相关主要数据结构 struct sigactq {FAR struct sigactq *flink; /* Forward link */struct ...

  2. Java并发编程—常见面试题

    建议: 学习java并发前需要先掌握JVM知识 关于下面问题档案的详细解析都在后面推荐的相关系列文章中 一.线程安全相关 1.什么叫线程安全? 线程安全就是说多线程访问同一代码,不会产生不确定的结果. ...

  3. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  4. ①Linux简明系统编程(嵌入式公众号的课)---总课时12h

    10.09 注意:这个是Linux高级编程的简明教程,是Linux应用程序的开发,而不是底层程序的开发. 内容是关于操作系统和网络编程的吗? Linux简明系统编程 〇.课程思维导图 〇.会用到的头文 ...

  5. 实现生产者消费者的三种方式

    文章目录 wait/notify的消息通知机制 预备知识 wait/notify消息通知潜在的一些问题 notify过早通知 等待wait的条件发生变化 假死状态 wait/notifyAll实现生产 ...

  6. Java深入学习并发原理总结

    Java 并发多线程基础总结 线程池 线程池的简介 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线 ...

  7. 数字IC面试经验及面试题总结(内附大厂试题)

    前言 微电子这行,现在本科生出去做研发会比较难,尤其是大公司,很少招本科生去做研发,除非很优秀,读研了导师又不愿意放你出去实习,结果就是到了找工作那一步,总觉得有点心虚. 而我作为一个学酥,当找工作这 ...

  8. 22 - OAI rfsimulator 射频仿真- 博一

    最近有朋友问我OAI的rfsimulator怎么用,我就简单举个例子分享一下:包括如何使用rfsimulator.如何新建一个自己定义的信道. OAI 的rfsimulator顾名思义是用来替代真实的 ...

  9. Python中signal.hilbert与fftpack.hilbert的区别

    文章目录 1 代码演示 2 分析总结 在Python的scipy模块中,有两个实现希尔伯特变换计算的方式,分别为signal.hilbert与fftpack.hilbert,但是这两种方式得到的结果有 ...

最新文章

  1. 我也来搭android环境
  2. Codeforces Round #331 (Div. 2) A. Wilbur and Swimming Pool 水题
  3. STM32开发 -- 惯导模块开发详解
  4. 正则表达式在JS中的应用
  5. 【Alpha】事后分析
  6. C#反射之Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom方法介绍
  7. [蓝桥杯][基础练习VIP]2n皇后问题(深搜)
  8. python多线程同步与互斥_python多线程编程(3): 使用互斥锁同步线程
  9. 【Java中级篇】Dom4j解析xml数据
  10. python deque_python中deque类详解
  11. newifimini出厂固件_新路由mini固件|newifi新路由mini OS固件V3.2.1.1100 抢先版 - 极光下载站...
  12. How To Replace The Firefox Icon With Your Logo
  13. Oracle 基本查询:dual、distinct、null、between and、in、like、order by、group by、dual、as
  14. 上班时间应该包含交通时间
  15. Deeping Learning学习与感悟——《深度学习工程师》_4
  16. java实现一个录像大师
  17. 3.6计算机网络(网络层概述 电路交换 报文交换 分组交换)
  18. 新词发现的学习和代码
  19. 28岁程序员从字节退休:IT是改命的唯一出路吗?
  20. 不要告诉别人,你家男人看见美女就不老实

热门文章

  1. 麻雀要革命2 第8节:莽撞的麻雀小姐
  2. java队列处理高并发_Java高并发--消息队列
  3. 如何将视频生成二维码?
  4. python去重计数_用Python做透视表之value_sum和value_countdistinct功能
  5. jquerymobile-16 select menu
  6. 使用GF集进行构型综合的方法之总结
  7. domino前后端彻底分离,请使用最流行的vue、react做开发--国内首创
  8. js点击箭头旋转的实现
  9. 关于在GET请求中使用body
  10. 在美国纽约哪里有西联汇款?本文提供美国纽约法拉盛西联汇款网点代理地址