Linux系统编程之信号(上)

news2025/2/13 21:32:01

一、信号概念

        信号就是软件中断。每当程序收到一个信号,都需要按指定的方法去处理。以下是UNIX系统的信号表。

         其中core表示产生一个复制了该进程内存映像的core文件,它保存了程序现场,可以使用gdb来调试。

二、signal()

        signal()函数用于改变某个信号的响应方法。

         第一个参数是信号的编号,有一组宏定义可以使用。第二个参数是函数指针,要么是SIG_IGN(忽略信号)或SIG_DFL(默认方式),要么是自己定义的一个处理函数的地址。

        返回值是调用signal()之前的处理函数的指针。注意这里man手册中sighandler_t的typedef并没有在标准C中定义,这里只是方便阅读而加上的,所以如果要接受它的返回值,要么用void (*func)(int),要么自己typedef.

        还需注意的是:除了SIG_IGN外,其他的信号处理都会打断阻塞的系统调用。例如当在执行sleep的时候收到一个信号,sleep会提前结束,并且errno会被设置为EINTR。

三、可重入函数

        该概念一般用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。在linux中部分库函数被提供了以“_r”结尾的可重入版本。

满足下列条件的函数多数是不可重入的:

  • 函数体内使用了静态(static)的数据结构;
  • 函数体内调用了 malloc() 或者 free() 函数;
  • 函数体内调用了标准 I/O 函数; 

四、信号的响应过程

        内核为每个进程都维护了两个位图:mask位图和pending位图。

mask :用来表示当前信号是否被屏蔽,1表示未屏蔽,0表示屏蔽,初始值一般全为1.
pending: 用来记录当前进程收到哪些信号,1表示收到对应信号,0表示未收到,初始值一般全为0.

        当有信号来时,对应的pending位置为1,程序被内核的中断机制打断,保存当前的执行现场,进入到内核态排队。当从内核态回到用户态时会将mask位图 &(按位与) 上pending位图来判断有哪些信号,执行对应的信号处理函数,此时对应的mask位和pending位均置为0,当执行完信号处理函数后,将对应的mask位置为1。

        注意:程序从接收到信号到响应信号会有一个不可避免的延迟,只有程序从内核态切换到用户态的时候,才会比较 mask位图 和 pending位图。且标准信号的响应没有严格的顺序。

思考:

1.如何忽略掉一个信号?

   答:将masks置为0.

2.标准信号为什么要丢失?

  答:pending无论收到多少个信号都是置为1,无法计数。

五、kill(),raise(),alarm(),pause()

1.kill()

        kill()函数用于向其他进程或进程组发送信号。

         pid参数不同取值有不同意义:

  1. 正整数:如果pid是一个正整数,那么kill()函数将会向该进程ID对应的进程发送指定的信号。

  2. 0:如果pid为0,kill()函数将会向与调用进程(当前进程)属于同一进程组的所有进程发送信号。

  3. -1:如果pid为-1,kill()函数将会向所有有权限发送信号的进程(除了init进程)发送信号。init进程是所有进程的祖先,因此除了init进程之外的所有进程都可以收到该信号。

  4. 负整数:如果pid是一个负整数,kill()函数将会向进程组ID等于-pid的进程组发送信号。这里的-pid表示将pid取反,得到一个负整数值,表示对应的进程组ID。

    返回值:成功返回0,否则返回-1,并设置对应errno.

2.raise()

        raise()函数用于给当前进程发送信号。

         在单线程程序中相当于kill(getpid(),sig); 在多线程程序中相当于pthread_kill(pthread_self(),sig);

3.alarm()

        alarm()函数会在调用的seconds秒后给当前进程发送一个SIGALRM信号,该信号默认处理方式一般为终止。

         如果多次调用alarm(),会以最后一个为准,并且前一个alarm剩余的时间会作为后一个alarm()的返回值。

        当seconds为0时不会产生alarm,通常用来取消之前的alarm.

4.pause()

        pause()函数会暂停当前线程直到收到一个信号。

         在一些操作系统中sleep()就是用alarm()+pause()实现的。

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

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

相关文章

23款奔驰C260升级原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶,可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出,并且在关闭后能够立刻散去。车内气味不会永久改变,香氛…

高压放大器如何正常使用的呢

高压放大器是一种用于将低电压信号转换成高电压信号的电子设备。它广泛应用于通信、雷达、医疗设备等领域。正确使用高压放大器对于保证设备的正常运行和延长使用寿命至关重要。下面安泰将介绍高压放大器的使用方法和注意事项,帮助您更好地了解如何正确使用高压放大…

proteus仿真uart串口实验

串口通信在单片机开发中是一种很常见的通信方式,一般所说的串口是对应rs232标准,对应有gnd,vcc,rx,tx四根数据线。其中rx,tx分别是接收、发送端口,而在实际接线中,我们需要注意,rx接另一端tx,tx接另一端的rx。在51单片…

buildroot使用介绍

buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包…

恒盛策略:创业板交易规则?

创业板是指中国证监会于2009年11月创立的一种股票商场,是为了鼓励和支撑中小企业发展所建立的。相比于主板,创业板的公司一般融资规模较小,危险较高,但也具有高成长性和出资价值。而创业板买卖规则,则是指这个商场内的…

智谷星图赵俊:让人才和区块链产业“双向奔赴”丨对话MVP

区块链产业需要什么样的人才?赵俊很有发言权。 赵俊是北京智谷星图科技有限公司的技术总监,也是FISCO BCOS官方认证讲师。他2017年接触区块链,随后选择人才培育领域深耕。“为区块链行业引进更多人才这件事很有价值,跟我的职业理…

数据结构初阶--二叉树的链式结构

目录 一.二叉树链式结构的概念 二.二叉树链式结构的功能实现 2.1.链式二叉树的定义 2.2.链式二叉树的构建 2.3.链式二叉树的遍历 2.3.1.先序遍历 2.3.2.中序遍历 2.3.3.后序遍历 2.3.4.层序遍历 2.4.链式二叉树的求二叉树的结点数量 法一:计数法 法二&a…

[保研/考研机试] KY135 又一版 A+B 浙江大学复试上机题 C++实现

题目链接&#xff1a; KY135 又一版 AB https://www.nowcoder.com/share/jump/437195121691736185698 描述 输入两个不超过整型定义的非负10进制整数A和B(<231-1)&#xff0c;输出AB的m (1 < m <10)进制数。 输入描述&#xff1a; 输入格式&#xff1a;测试输入包…

鸿蒙开发学习笔记1——真机运行hello world

问题背景 学习任何语言和框架的第一步&#xff0c;永远都是跑通熟悉的“hello world”&#xff0c;本文将介绍鸿蒙开发如何跑通“hello world”。 问题分析 一、构建第一个ArkTS应用&#xff08;fa模型&#xff09; 说明&#xff1a;请使用DevEco Studio V3.0.0.601 Beta1及…

安装Tomac服务器——安装步骤以及易出现问题的解决方法

文章目录 前言 一、下载Tomcat及解压 1、选择下载版本&#xff08;本文选择tomcat 8版本为例&#xff09; 2、解压安装包 二、配置环境 1、在电脑搜索栏里面搜索环境变量即可 2、点击高级系统设置->环境变量->新建系统变量 1) 新建系统变量&#xff0c;变量名为…

c#在设计时调试自定义 Windows 窗体控件

private string demoStringValue null; [Browsable(true)] public string DemoString {get{return this.demoStringValue;}set{demoStringValue value;} } 参考链接 在设计时调试自定义控件 - Windows Forms .NET Framework | Microsoft Learnhttps://learn.microsoft.com/z…

PACS系统选型及组成

PACS系统软件选型 目前PACS系统的软件架构选型上看&#xff0c;主要有C/S和B/S两种形式。 C/S架构&#xff0c;即Client /Server&#xff08;客户机/服务器&#xff09;架构&#xff0c;将运算任务合理分配到客户机端和服务器端&#xff0c;降低了整个系统的通信开销&#xf…

数据结构刷题训练:队列实现栈

目录 前言 1. 题目&#xff1a;使用队列实现栈 2. 思路 3. 分析 3.1 创建栈 3.2入栈 3.3 出栈 3.4 栈顶数据 3.5 判空和 “ 栈 ” 的销毁 4. 题解 总结 前言 我们已经学习了栈和队列&#xff0c;也都实现了它们各自的底层接口&#xff0c;那么接下我们就要开始栈和队列的专项刷…

在SPSS中实现数据转置

在使用SPSS开展数据分析的过程中&#xff0c;有时候不可避免需要对数据进行转置处理。 例如Kendall协同系数检验和组内相关系数&#xff08;ICC&#xff09;检验这两种方法都可以检验定量数据的一致性程度&#xff0c;但是这两种方法对数据的要求不同。 组内相关系数&#xf…

ArcGIS Pro 基础安装与配置介绍

ArcGIS Pro ArcGIS Pro作为ESRI面向新时代的GIS产品&#xff0c;它在原有的ArcGIS平台上继承了传统桌面软件&#xff08;ArcMap&#xff09;的强大的数据管理、制图、空间分析等能力&#xff0c;还具有其独有的特色功能&#xff0c;例如二三维融合、大数据、矢量切片制作及发布…

Blazor 简单组件(2):B_row/B_col 12分隔布局 简单开发

文章目录 前言12分隔布局开发B_col.razorB_col.razor.cssB_row.razorB_row.razor.css 使用案例 前言 Blazor 简单组件(0)&#xff1a;简单介绍 12分隔布局开发 B_col.razor if (Offset ! "0") {<div style" grid-column-start: span (Offset)">&l…

solr迁移到另一个solr中(docker单机)

背景介绍 solr数据迁移&#xff0c;或者版本升级&#xff0c;需要用到迁移&#xff0c;此处记录一下迁移方法以及过程中遇到的问题。我这边使用的是docker环境&#xff0c;非docker部署的应该也是一样的。 solr部署教程 准备工作 ● solrA 版本&#xff1a; 8.11.2 (已有so…

数据分析两件套ClickHouse+Metabase(一)

ClickHouse篇 安装ClickHouse ClickHouse有中文文档, 安装简单 -> 文档 官方提供了四种包的安装方式, deb/rpm/tgz/docker, 自行选择适合自己操作系统的安装方式 这里我们选deb的方式, 其他方式看文档 sudo apt-get install -y apt-transport-https ca-certificates dirm…

三款快速删除未使用CSS代码的工具

针对历史项目或项目中有引入CSS框架&#xff08;如Bootstrap&#xff09;&#xff0c;可能会存在大量的 CSS 样式未被使用。这可能产生一些不良的影响&#xff0c;如&#xff1a; 性能问题&#xff1a; 未使用的CSS会增加页面的加载时间&#xff0c;因为浏览器需要下载并解析…

Field Symbol与数据引用的几个应用

这俩货都是指针。在动态编程里用。 但是从好理解的角度来看&#xff0c;都给他们理解成数据对象。 都得指向其他的数据对象。不过field symbol指的是其他的数据对象内存地址的值。而数据引用只是指向内存地址。 1.Field symbol 当Field Symbol指向了其他的数据对象&#xf…