linux 信号_Linux中的信号处理机制 [四]

57e5baaad80520cf05a99b1001dcadfe.png

信号与线程

Unix的信号机制在诞生之初,生活在只有进程(process)的相对单纯的环境中。自从Unix世界有了线程(thread)的概念,信号就被赋予了发往进程中某个特定线程的能力,当然,这也增加了整个信号机制实现的复杂度。本系列的前面三篇文章都是基于进程进行的信号实现机制的讨论,本文将着重介绍Linux中信号和线程之间的交互。

发送信号给线程

无论是kill()还是sigqueue(),都只能向进程发送信号,在Linux中,要向进程内的线程发送信号,需要使用tkill()或者tgkill():

int 

两个函数中,"tid"都是代表目标线程的PID,但tgkill()比tkill()多了一个"tgid"的参数。"tgid"是目标线程所在进程的PID,它可以用来防止向错误的线程发送信号。

发送方给目标线程发送信号时,可能目标线程已经因为某种原因退出了,按照Linux中PID的分配规则,退出线程/进程的PID可被分配给其他的线程/进程使用。这种情况下,如果使用tkill(),就可能出现将信号发送到不相干的线程上。引入"tgid"可以帮助进行目标线程所在进程的校验,这样出现错发的可能性就被大大地降低了。

线程对信号的接收

根据POSIX标准的定义,进程内的所有线程共享进程的信号处理函数,当进程内的一个线程为某个信号注册了处理函数,另一个线程可以更改这个处理函数。在Linux的实现中,线程作为独立的调度实体也有自己的task_struct,同一进程的不同线程的task_struct的"sighand"将指向同一个包含信号处理函数列表的sighand_struct。

c2551de9dbb043c21688b9cafb6843cb.png

但是,每个线程可以有单独的pending位图/队列和block位图。如果一个信号是发送给线程的,那么内核在递送该信号时,会将它放入线程私有的pending位图/队列中,之后根据目标线程的block位图的设置,直接由目标线程处理就可以了。

223a55dde6ddd70613e08e9cb74175ab.png

如果信号是发送给一个进程的,那么该信号在递送时将被内核放入进程的pending位图/队列中,由进程内的所有线程共享。接下来,内核会从进程的各个线程中,挑选一个block位图中没有屏蔽该信号的线程,来执行对应的信号处理函数,其中,进程的主线程将被内核优先选择。

但是有一些信号是需要进程内的全体线程都做出响应的,比如前面提到的令进程闻风丧胆的SIGKILL,它一旦到来,就不会留下一个活口。

当一个线程即将被内核调度执行,而该线程私有的penging位图/队列和所在进程共享的penging位图/队列上都有待处理的信号时,内核将优先向线程递送私有的penging位图/队列上的信号:

int 

作为Unix时代的产物,前面讲到的sigprocmask()函数最初是用来设置进程的block位图的,但是同pending位图/队列不同的是,并没有一个所谓的线程共享的block位图的概念,所以在多线程环境下,sigprocmask()的语义也就变成了设置线程的block位图。当然,为了语义更加明显,你可以使用POSIX线程库提供的pthread_procmask()函数,两者的参数和行为都是一样的。

参考:

  • 《Linux环境编程:从应用到内核》第6章
  • Understanding the Linux Kernel 第3版第11章
  • UNIX Internals: The New Frontiers 第4章
  • http://kernel.meizu.com/linux-signal.html
  • https://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html?ca=drs-

原创文章,转载请注明出处。

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

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

相关文章

HP NIC Teaming技术探讨

NIC Teaming技术将2个或更多个网卡(HP NIC Teaming最多可达8个)捆绑在一起使用,以达到增加总的带宽(Load Balance,负载均衡)或者线路容错(Fault Tolerance)的目的。由2个或多个网卡组成一个逻辑网络端口Teamport,IP地址和网络设置绑定在这个逻…

仙居(一)

仙居(一) 仙居——仙人居住的地方。 景星岩全景 (看大图请点击) 其他图片在整理中,待我慢慢把图片和故事都理出来。转载于:https://www.cnblogs.com/hzy5901/archive/2011/03/31/5871611.html

我的电脑不联网,很安全!黑客:你还有风扇呢

全世界只有3.14 % 的人关注了爆炸吧知识转自:机器之心参与:张倩、蛋酱、杜伟从1988年第一个网络蠕虫病毒诞生以来,「互联网危机四伏」的观念就已经深入人心。如果只是这样,不给电脑联网、禁止使用任何可移动储存介质,数…

移动终端测试进化论

2019独角兽企业重金招聘Python工程师标准>>> 移动终端测试进化论 本案例主要以5年的现身经历,阐述针对移动互联网终端测试,从最基础的原始时代如何进入到现代化时代;从单一到多点密集;从对产品的质量保障进化到对产品信…

计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...

人类并不是完美的,我们经常在编写软件的时候犯错误。有时这些错误很容易找到:你的代码根本不工作,你的应用程序会崩溃。但有些 bug 是隐藏的,很难发现,这使它们更加危险。在处理深度学习问题时,由于某些不确…

MySQL从原理到实践,一篇从头到尾讲清楚

前两天,我跟一个面试官聊天,发现一个普遍现象,不少候选人,对数据库的认知,还处在比较基础的阶段,以为会写“增删改查”、做表关联就足够了,那些工作中经常出现的问题,却支支吾吾答不…

库卡机器人是s7编程_「西门子1200PLC教程」19.S7-1200入门实例

头条号私信回复1,可免费获取海量资源下载链接本文任务:电动机启保停控制练习按下瞬时启动按钮I0.6,电动机Q0.0启动;按下瞬时停止按钮I0.7,电动机Q0.0停止。目录1.组态设备2.编写程序3.下载项目4.监视运行情况1.组态设备…

戴尔新版bios设置中文_戴尔电脑装机过程

戴尔电脑装机过程U盘制作过程:一:启动盘安装 win 101、准备工具:一块空的 8G 以上的 U 盘、一套官网下载的 win 10 操作系统 2、制作启动盘:将下载好的操作系统直接解压到U盘里面就完成了 二:pe 盘安装 win 101、准备工…

云计算

一 云计算 1 定义1)新兴的互联网服务,该服务即是由成千上万的超级计算机构成的超强的计算机处理能力。2)用户可以通过购买这种服务来满足本地对计算机运算能力需求。3)互联网服务商一般会通过与某些需要计算机运算能力的软件的集成…

一组超炫酷的动图,感受那让人窒息的数学之美!

全世界只有3.14 % 的人关注了爆炸吧知识在蒋迅博客上看到的一组图片,转自imgur。本文来源:蒋迅的博客原文连接:http://blog.sciencenet.cn/blog-420554-923731.html

《飞机大战》安卓游戏开发源码(三)

为什么80%的码农都做不了架构师?>>> 本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/11/06/161/ 前言:最 近闲来无事,而且也是因为刚接触安卓不…

抽屉远离在计算机的应用,抽屉原理的应用及其推广优秀毕业论文

抽屉原理的应用及其推广优秀毕业论文 抽屉原理的应用及其推广 数学与计算机科学学院 数学与应用数学 指导老师: 王美能 摘要:抽屉原理也叫鸽巢原理,是研究如何将元素分类的一个原理,也是组合数学里最简单、最基本的原理。本文简述…

马斯克脑机接口_马斯克的脑机接口,让我倍感担忧

前段时间,特斯拉创始人马斯克展示了一项研究成果——把芯片装在人脑袋里。按照他的说法,植入的芯片不仅不会对人脑造成任何伤害,相反的,可以解决很多神经系统问题,比如注意力不集中、上瘾、焦虑等。不仅如此&#xff0…

kivy中文手册python_K-Meleon

K-Meleon K-Meleon - 一手掌控你的瀏覽體驗 K-Meleon 是一個速度超快、高度自訂、輕量化的網路瀏覽器,採用 Mozilla 開發、用於 Firefox 的 Gecko 佈局引擎。K-Meleon 完全免費、使用 GNU General Public License 授權的開放源碼軟體,專為 Microsoft Win…

男孩子也是要护肤的!!!

1 如果让一个黑人在黑暗中穿一件白色的衣服会是什么样的画面?2 自己做蛋糕翻车现场别人的▼你的▼3 单生狗的你4 在家健身翻车现场5 小朋友为了吃有多拼6 男孩子也是要护肤的你点的每个赞,我都认真当成了喜欢

JS对数据分页的封装方法

为什么80%的码农都做不了架构师?>>> 该文章属于原创:更多详细说明查看:http://www.pm-road.com/index.php/2014/07/24/26/ 因为web端经常会展示很多数据,如果一页下来,肯定会看的眼花缭乱,所以…

xftp6设置默认打开文件的程序_修改文件默认打开方式,不改变原图标

由于经常需要看pdf文件,一直以来都是用的Microsoft Edge阅读pdf文件,但是Microsoft Edge打开pdf文件字体的清晰度不高,而且使用ctrlf进行查找时,高亮部分不够明显,所以决定用Chrome来打开pdf文件,于是就将p…

名片管理系统python详解_名的解释|名的意思|汉典“名”字的基本解释

【丑集上】【口】 名康熙筆画:6 部外筆画:3【唐韻】武幷切【集韻】【韻會】彌幷切【正韻】眉兵切, 𠀤音詺。【說文】自命也。从口从夕。夕者,冥也。冥不相見,故以口自名。【玉篇】號也。【廣韻】名字也。【…

简单三分钟,本地搭建k8s

使用 minikube 在本地搭建 k8s 已经比以前要简单很多了。本文,我们通过简短的三分钟来重现一下在本地搭建 k8s 实验环境的步骤。下载 Minikube 首先,你可能会考虑从官网下载 minikube 然后进行安装,但是这样实际上可以预知的是,在…

作为史上最疯狂的科学家,特斯拉提出过哪些惊世骇俗的设想

全世界只有3.14 % 的人关注了爆炸吧知识尼古拉特斯拉是有史以来最疯狂的科学家之一,不管你认为他是天才还是疯子,都无法否认他的才华和想象力。特斯拉在他的时代提出了许多天才的发明和想法,其中一些直到今天都被认为是不切实际或极其危险的。…