你真的懂Linux线程和信号的关系吗?

news2024/11/18 5:51:32

前言:

讲到信号,我们更多的是站在进程的角度去理解信号,当一个进程有多个线程的时候,那么进程,线程,信号三者之间会是什么样的关系呢?

1.线程与信号的关系

线程与信号关系要遵循以下标准:

  • 标准1:同一线程组线程之间共享信号处理函数。

  • 标准2:线程有独立的阻塞信号集。

  • 标准3:私有未决信号队列和共享未决信号队列。

  • 标准4:收到致命信号,线程组退出。

2.同一线程组线程之间共享信号处理函数(标准1)。

创建进程时,线程task_struct对象sighand成员会指向主线程指向的struct sighand_struct对象,线程组所有线程共享主线程信号表。

原来的进程此时理解为主线程。

3.线程有独立的阻塞信号集(标准2)。

每个线程task_struct都有各自的阻塞/屏蔽信号集(blocked成员)。

通过pthread_sigmask可以设置阻塞/屏蔽信号集,用来屏蔽特定的信号,

进程(主线程)可以由sigprocmask函数或者pthread_sigmask函数来设置阻塞/屏蔽信号集。

sigprocmask函数和pthread_sigmask底层实现方式一样,没有区别。


pthread_sigmask函数原型

int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);

功能:pthread_sigmask函数用于设置线程阻塞信号集。

参数:

how:表示信号屏蔽字的修改方式。可以取以下三个值之一:

  • SIG_BLOCK:将set指定的信号添加到进程的当前信号屏蔽字中。

  • SIG_UNBLOCK:将set指定的信号从进程的当前信号屏蔽字中移除。

  • SIG_SETMASK:将当前信号屏蔽字设置为set指定的值。

set:指向需要修改的新信号屏蔽字集合的指针。

oldset:指向保存之前信号屏蔽字的集合的指针。

返回值:

成功:返回0。

失败:返回-1,并设置errno。

相关视频推荐

2024年c/c++程序员如何提升自己的核心竞争力?这套linux c/c++后端服务器开发技术教程不要错过!icon-default.png?t=N7T8https://www.bilibili.com/video/BV1CF4m1L7hU/

Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享


4.私有未决信号队列和共享未决信号队列(标准3)。

每个线程task_struct都有各自的未决信号队列(pending成员)。

每个线程组主线程有一个共享未决信号队列(signal成员),其他线程共享主线程共享未决信号队列。

当主线程收到信号后,如果主线程设置了阻塞/屏蔽信号集,那么该信号会存储在共享未决信号队列,比如通过kill或者sigqueue函数发送给主线程的信号。

其他线程收到信号后,如果线程设置了阻塞/屏蔽信号集,那么该信号会存储在私有未决信号队列,比如通过tkill,tgkill,pthread_kill,以及pthread_sigqueue函数发送给线程的信号。

共享未决信号队列信号如何处理?

  • 主线程优先处理共享未决信号队列信号。

  • 其他线程在主线程不方便处理时,才会处理共享未决信号队列信号。


tkill函数原型

int tkill(int tid, int sig);

int tgkill(int tgid, int tid, int sig);

描述:

tkill函数用于发送信号到指定线程,tid表示线程ID,sig表示信号编号,不安全尽量少用。

tgkill函数用于向指定线程发送信号,tgid表示线程组ID,tid表示线程ID,sig表示信号编号。

返回值:

成功:返回0。

失败:返回-1,并设置errno。


pthread_kill函数原型

int pthread_kill(pthread_t thread, int sig);

功能:pthread_kill函数用于向指定线程发送信号的函数。

参数:

thread:为目标线程的标识。

sig:要发送的信号的编号。

返回值:

成功:返回0。

失败:返回errno。


pthread_sigqueue函数原型

int pthread_sigqueue(pthread_t thread, int sig,

                const union sigval value);

功能:pthread_sigqueue函数是一个用于向指定线程发送信号及数据的函数。

pthread_sigqueue使用方法可以参考sigqueue函数。

参数:

thread:为目标线程的线程标识符。

sig:为要发送的信号编号。

value:为发送给目标线程的附加数据。

返回值:

成功:返回0。

失败:返回errno。


常用产生信号函数对比:

5.收到致命信号,线程组退出(标准4)。

所谓致命信号就是能让线程终止的信号,可查看信号默认处理方式表。

这一条标准的目的是为了实现同一线程组里线程的统一退出管理。

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

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

相关文章

【Node.js从基础到高级运用】十四、Node.js 错误处理与日志记录

引言 在这篇博客文章中,我们将深入探讨Node.js中的错误处理和日志记录的最佳实践。我们会了解如何在Node.js应用程序中有效地捕获和处理错误,并利用日志库如morgan来记录应用程序的活动和错误信息。 第1部分:Node.js中的错误处理 同步代码中…

Aigtek电压放大器的作用及优点是什么

电压放大器是电子技术领域中重要的设备,其作用是将输入信号的电压放大到所需的输出电压水平。电压放大器具有多种优点,下面安泰电子将详细介绍其作用及主要优点。 电压放大器的主要作用是增加信号的电压幅值。通过放大信号的电压,可以增强信号…

苹果MacOS电脑使用内网穿透轻松远程桌面本地Windows系统电脑

文章目录 1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1.2 局域网远程控制windows 2. 测试Mac公网远程控制windows2.1 在windows电脑上安装cpolar2.2 Mac公网远程windows 3. 配置公网固定TCP地址 日常工作生活中,有时候会涉及到不同设备不同操作系统之间需要…

Soul打造多元社交元宇宙,满足年轻人多样化的设计需求

近年来,元宇宙概念备受瞩目,成为全球关注的热门话题。其中,Soul App凭借其独特的Gamified游戏化社交理念,早早成为了元宇宙的开拓者之一。通过持续布局元宇宙赛道,加大技术创新力度,以及创新平台玩法和场景,Soul为用户打造了一个真实、温暖、多元的社交元宇宙,深受Z世代用户的喜…

Python脚本:用py处理PDF的五大功能

一、代码 【第三方库】3个 【Py版本】3.9 【使用前提】关闭所有的word文档 import os from datetime import datetime from docx2pdf import convert from pdf2docx import parse from PyPDF2 import PdfMerger from PyPDF2 import PdfReader,PdfWriter#将文件夹中的所有Wo…

Python从COCO数据集中抽取某类别的数据

1、问题描述 今天需要训练一个人工智能检测模型,用于检测图片或视频中的人。自行收集训练数据费时费力,因而选择从公开数据集COCO中进行抽取。 2、数据准备 2.1 下载 COCO2017 数据集 train:http://images.cocodataset.org/zips/train2017.zip valid…

杉德支付配合调查 - 数字藏品服务

最近,数字收藏品平台淘派发布了一则公告,宣布支付通道杉德已暂停接口服务,以配合调查。 近期发现多个异常账户,涉嫌盗取他人信息和银行卡,利用平台从事非法交易。淘派已第一时间报警,协助警方追回资金(回执…

学生能力是如何被封印的

为了避免无法发表,需要借助人工智能。 为什么一直没写 这个主题其实很多年前就明晰了,但是没有勇气去写出来。 责任全在人工智能 如下是人工智能的回复,如有责任,全都是人工智能的责任。 在学生的情境中,“能力被封印…

Kigo Netflix Video Downloader:Mac与Windows用户的视频下载利器

随着网络的发展和普及,越来越多的人开始使用在线流媒体服务来观看电影、电视剧和其他视频内容。其中,Netflix是世界上最受欢迎的流媒体平台之一。然而,对于想要离线观看这些视频内容的用户来说,下载它们可能会变得有些困难。幸运的…

一文教会你SpringBoot是如何启动的

SpringBoot启动流程分析 流程图 源码剖析 运行Application.run()方法 我们在创建好一个 SpringBoot 程序之后,肯定会包含一个类:xxxApplication,我们也是通过这个类来启动我们的程序的(梦开始的地方),而…

J.砍树【蓝桥杯】树上差分+LCA

树上差分 多次对树上的一些路径做加法操作,然后询问某个点或某条边经过操作后的值,就要考虑树上差分了。 点差分 模拟这个过程 对x到y路径上的点权值均1,可以等价成对x和y的权值加1,对lca的权值-1,对fa[lca]的权值-…

操作系统知识-存储管理+文件管理管理-嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 本章的主要内容见下图: 1、存储管理&#…

【数据结构取经之路】归并排序

简介 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,…

在Docker上传我们自己的镜像(以springboot项目为例)

首先确定好在我们的centOS服务器上已经安装并配置好docker 配置自己的springboot镜像并运行 获取springboot的jar包 maven clean--》mavenue package --》复制target目录下生成的jar包 在服务器选择一个文件夹上传jar包,我这里选用的文件夹叫做/opt/dockertest…

如何在HomeAssistant智能家居系统中添加HACS集成并实现无公网IP远程连接家中设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant,通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店,将米家,果家设备接入 Home Assistant。 基本条件…

Python the code is unreachable

Python the code is unreachable 正文 正文 相信有不少小伙伴在使用 Python 的时候有时候会遇到 the code is unreachable 这样的 warning 提示。这种提示表示在我们当前书写的代码种有一部分代码被屏蔽了。可能会存在潜在的 bug,需要我们注意,那么什么…

2023年蓝桥杯省赛——幸运数字

目录 题目链接:0幸运数字 - 蓝桥云课 (lanqiao.cn) 解法 思路 高级思路 总结 题目链接:0幸运数字 - 蓝桥云课 (lanqiao.cn) 解法 首先是我写了差不多一个小时的解法,裂开了,为什么我如此废物 思路 寻找第2023个在二进制、八…

弱电工程是什么?常见的类型有哪些?

一、什么是弱电工程?强电和弱电的区别有哪些? 弱电工程又叫智能建筑,也叫系统集成工程,所有与信息有关的都属于弱电这一块的。弱电是相对于强电而言的强电和弱电从概念上讲,一般是容易区别的,主要区别是用途的不同。强电是用作…

Compute Express Link (CXL): An Open Interconnect for Cloud Infrastructure——论文阅读

DAC 2023 Paper CXL论文阅读笔记整理 背景 Compute Express Link是一种开放的行业标准互连,在PCI Express(PCIe)之上提供缓存和内存语义,具有资源池和织物功能。本文探讨了CXL在解决云基础设施中的一些挑战方面的作用。 CXL主要…

Python:文件的操作

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) Python的os库主要用于与操作系统进行交互,它提供了多种功能,使得在Python程序中处理操作系统级任务变得容易。这里是一些…