3.14-信号

信号

信号描述

  • 信号的共性:
    1. 简单
    2. 不能携带大量数据
    3. 满足某一特定条件才发送
  • 信号的特质:
    • 信号软件层面的中断,一旦信号产生,无论程序执行到什么位置,必须立即停止,处理信号,处理结束后,再继续执行后续指令。
    • 所有的信号的产生和处理都是由内核完成。
    • 信号的实现手段导致信号有很强的延时。对用户而言依然感觉不到

信号相关的概念

  • 未决:
    • 产生与递达(处理)之间的状态,该状态主要受阻塞(屏蔽)影响。
  • 递达:
    • 内核产生信号后递送并且成功到达进程。递达的信号会被内核立即处理。
  • 信号处理方式:
    1. 执行默认动作。
    2. 忽略(丢弃)。
    3. 捕捉(调用用户指定的函数)。
  • 阻塞信号集:
    • 本质:位图。用来记录信号的屏蔽状态。
    • 该信号集中的信号,表示成功被设置屏蔽。再次受到该信号,其处理动作将延后至解除屏蔽。此期间该信号一直处于未决态。
  • 未决信号集:
    • 本质:位图。记录信号的处理状态。
    • 该信号集中的信号表示信号已经产生但尚未被处理。

信号四要素

  • 信号使用之前,必须确定四要素再使用。
  1. 编号
  2. 名称
  3. 事件
  4. 默认处理动作
  • 使用命令kill -l查看 Linux 系统中支持的所有信号。
    1. SIGKILL 和 19) SIGSTOP信号,不允许忽略和捕捉,只能执行默认动作,不能将其设置为阻塞。

信号产生

  1. 按键产生
    • Ctrl + c -> 2) SIGINT(终止/中断)
    • Ctrl + \ -> 3) SIGQUT(退出)
  2. 系统调用产生
    • alarm() -> 14) SIGALRM
  3. 软件条件产生
    • alarm() -> 14) SIGALRM
    • setitimer() -> 14) SIGALRM
  4. 硬件异常产生信号
    • 段错误:内存访问异常 -> SIGSEGV
    • 浮点数例外:除零 -> 8) SIGFPE
  5. 命令产生
    • kill 命令

kill 函数、命令产生信号

#include <signal.h>int kill(pid_t pid, int sig); // 发送信号给一个指定的进程
参:pid:> -1:发送信号给指定进程。= 0:发送信号给跟调用 kill 函数的那个进程,处于统一进程组的进程。< -1:取绝对值,发信号给所有该组的组员。-1:发送信号给有权限发送的所有进程。sig:信号编号返回值:成功:0失败:-1,errno

alarm函数产生信号

  • 每个进程有且仅有唯一的一个闹钟
unsigned int alarm(unsigned int seconds); // 设置定时,发送 SIGALRM 信号
seconds:定时的秒数
返回值:上次定时剩余时间。不会出错。
  • 使用 time 命令查看程序执行消耗的时间。
  • 实际时间 = 用户时间 + 内核时间 + 等待时间
  • time ./alarm > out —— 程序优化的瓶颈在 IO

信号集操作函数

#include <signal.h>sigset_set 自定义信号集int sigemptyset(sigset_t *set);
清空自定义信号集int sigfillset(sigset_t *set);
将信号集全部置1int sigaddset(sigset_t *set, int signum);
将一个信号添加到信号集int sigdelset(sigset_t *set, int signum);
将一个信号从信号集中清除以上四个函数返回值:
成功:0  失败:-1,errnoint sigismember(const sigset_t *set, int signum);
判断一个信号是否在集合中
在:1
不在:0

操作信号屏蔽字

  • 设置屏蔽信号、接触屏蔽,都使用 sigpromask
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参:how:SIG_BLOCK: 设置阻塞SIG_UNBLOCK:解除屏蔽SIG_SIEMASK:用自定义信号集替换 maskset:自定义 set。oldset:保存修改前的 mask 状态,以便将来恢复。
返回值:成功:0  失败:-1,errno
  • 查看未决信号集函数sigpending
#include <signal.h>int sigpending(sigset_t *set);
参 set:传出参数。未决信号集。
返回值:成功:0  失败:-1,errno

信号捕捉

signal 函数

#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);1:待捕捉的信号编号。
参 2:一旦捕捉到该信号,执行的回调函数
返回值:

sigacton 函数

  • 注册某一个信号的捕捉时间,指定回调函数。
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);1:待捕捉的信号
参 2:传入参数,指定新的处理方式
参 3:传出参数,保存就有的信号处理方式。
返回值:成功 0  失败:-1,errnostruct sigaction {void     (*sa_handler)(int); 捕捉函数名,复制 SIG_IGN 表示忽略,赋值 SIG_DEF 表示默认动作void     (*sa_sigaction)(int, siginfo_t *, void *); 信号传参。sigset_t   sa_mask; 信号捕捉函数调用期间所要屏蔽的信号int        sa_flags; 通常为 0,使用默认属性void     (*sa_restorer)(void);
};

信号捕捉特性

  1. 捕捉函数执行期间,信号屏蔽字由原来的 mask 改为sa_mask,捕捉函数执行结束,恢复回 mask。
  2. 捕捉函数执行期间,本信号自动被屏蔽(sa_flags = 0)
  3. 捕捉函数执行期间,被屏蔽的信号执行多次,解除屏蔽后只处理一次

借助信号捕捉,完成子进程回收

SIGCHLD 产生的条件

  • 子进程的运行状态发生变化,就会给父进程发送 SIGCHLD

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

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

相关文章

链表·简单归并

cur->next la; //将 p指针所指向的链表节点的 next 指针&#xff08;也就是 p 节点的下一个节点的指针&#xff09;指向 l1 所指向的链表节点。简单来说&#xff0c;就是把 la 节点连接到 p 节点的后面&#xff0c;更新了链表的连接关系。 p la; //将p指针的值更新为 la …

kmp报错→Cannot find skiko-windows-x64.dll.sha256

1、前言 学习kmp&#xff08;Kotlin MultiPlatform简称&#xff09;过程中报了错误&#xff0c;这个报错在直接运行desktop的main方法才会出现&#xff0c;用gradle运行却不会报错&#xff0c;新建的kmp项目也不会出现&#xff0c;我学习的写了一些代码的项目才会出现。   运…

MySQL(事物下)

目录 一 多版本并发控制&#xff08; MVCC &#xff09;是一种用来解决 读-写冲突 的无锁并发控制 1. 前置知识 示例&#xff1a; 二 Read View 1. 当事物进行快照读(读历史数据)会MySQL会创建一个Read Vidw类对象&#xff0c;用来记录和当前一起并发的事物(活跃的事物)&a…

星型组网模块的两种交互方式优缺点解析

星型组网模块简介 星型组网模块工作在433MHz频段&#xff1b;星型组网模块集主机&#xff08;协调器&#xff09;、终端为一体&#xff0c;星型组网模块具有长距离、高速率两种传输模式&#xff0c;一个主机&#xff08;协调器&#xff09;支持多达200个节点与其通讯&#xff0…

IMX6ULL学习整理篇——UBoot的一些基础知识(1.编译流程)

前言 笔者整理了最近刷IMX6ULL的一些学习笔记&#xff0c;这里打算稍微整理一下东西发上来作为作为一个补充 正文 大部分而言&#xff0c;当我们拿到源码的时候&#xff0c;一般都是——先使用make来生成一份针对我们目标开发板的配置。举个例子&#xff0c;正点原子针对他们…

docker桌面版启动redis,解决无法连接

docker run -d --name redis -p 6379:6379 -v E:\2\redis\redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf 在本地创建一个目录&#xff0c;里面有个redis.conf文件&#xff0c;内容如下&#xff0c;启动时绑定这个配置文件目…

2025-03-15 学习记录--C/C++-PTA 习题3-3 出租车计价

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题3-3 出租车计价 本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下&#xff1…

《C++ Primer》学习笔记(二)

第二部分&#xff1a;C标准库 1.为了支持不同种类的IO处理操作&#xff0c;标准库定义了以下类型的IO&#xff0c;分别定义在三个独立的文件中&#xff1a;iostream文件中定义了用于读写流的基本类型&#xff1b;fstream文件中定义了读写命名文件的类型&#xff1b;sstream文件…

数据类设计_图片类设计之6_混合图形类设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论混合图形类设计 方法论-现在能做什么 这段属于聊天内容---有句话是这么说的&#xff1a;不要只埋头拉车&#xff0c;还要抬头看路。写代码也是…

招聘信息|基于SprinBoot+vue的招聘信息管理系统(源码+数据库+文档)

招聘信息管理系统 目录 基于SprinBootvue的招聘信息管理系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2管理员功能模块 5.3企业后台管理模块 5.4用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

【软件】免费的PDF全文翻译软件,能保留公式图表的样式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 很多PDF全文翻译软件都是收费的&#xff0c;而划线翻译看着又很累。这个开源的PDF全文翻译软件非常好用&#xff0c;并且能够保留公式、图表、目录和注…

79.HarmonyOS NEXT 手势操作模型详解:移动、缩放与旋转的实现原理

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 手势操作模型详解&#xff1a;移动、缩放与旋转的实现原理 文章目录 HarmonyOS NEXT 手势操作模型详解&#xff1a;移动、缩放与旋…

解读Ant Design X API流式响应和流式渲染的原理

前言 AI是未来世界的趋势&#xff0c;deepseek的出现让在国内构建更多的大模型出现了更多的可能。而从前端出发&#xff0c;Ant design团队最近很有意思&#xff0c;基于这个背景&#xff0c;提供了一套面向构建平台化产品的组件。 本篇结合Ant design AI的XSteam、XRequesta…

CentOS 7 64 安装 Docker

前言 在虚拟机中安装 Docker 是一种常见的测试和开发环境搭建方式。通过在虚拟机上安装 Docker&#xff0c;可以方便地创建和管理容器化应用&#xff0c;同时避免对宿主机系统造成影响。以下是在 CentOS 7 虚拟机中安装 Docker 的详细步骤。 1. 更新系统&#xff08;可以不操作…

SPI驱动(八) -- SPI_DAC设备驱动程序

文章目录 参考资料&#xff1a;一、编写设备树二、 编写驱动程序三、编写测试APP四、Makefile五、上机实验 参考资料&#xff1a; 参考资料&#xff1a; 内核头文件&#xff1a;include\linux\spi\spi.h内核文档&#xff1a;Documentation\spi\spidevDAC芯片手册&#xff1a;…

Ansible 自动化运维

Ansible架构: 一.部署主机清单 前期环境准备: 管理端: 192.168.60.128 被管理端: client1:192.168.60.129 client2:192.168.60.131 1.所有被管理端配置ssh密钥 (1.免密登陆 2.允许root远程登陆) 脚本如下: #!/bin/bash# 检查 sshpass 是否已安装 if ! command -v ss…

Qt 实现波浪填充的圆形进度显示

话不多说&#xff0c;先上效果图 代码示例&#xff1a; #include <QApplication> #include <QWidget> #include <QPainter> #include <QPropertyAnimation> #include <QTimer> #include <cmath>class WaveProgressBar : public QWidget {…

DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)

视频讲解&#xff1a; DQN 玩 2048 实战&#xff5c;第一期&#xff01;搭建游戏环境&#xff08;附 PyGame 可视化源码&#xff09; 代码仓库&#xff1a;GitHub - LitchiCheng/DRL-learning: 深度强化学习 2048游戏介绍&#xff0c;引用维基百科 《2048》在44的网格上进行。…

星越L_外后视镜使用讲解

目录 1.外后视镜调节 2后视镜折叠 3.后视镜加热 1.外后视镜调节 L控制左边后视镜调节,上下拨动调整视野,一般此镜左右21分,上下55开。 R控制左边后视镜调节,上下拨动调整视野,一般此镜左右13分,上下55开。 2后视镜折叠 车辆解锁自动展开 车辆关闭自动折叠 严寒天气…

2025-03-15 Python深度学习2——Numpy库

文章目录 1 基础1.1 数据类型1.1.1 整型数组与浮点型数组1.1.2 元素同化1.1.3 数组类型转换 1.2 数组维度1.2.1 一维数组与二维数组1.2.2 数组形状变换 2 创建数组2.1 创建指定数组2.2 创建递增数组2.3 创建同值数组2.4 创建随机数组 3 索引3.1 访问数组元素3.1.1 访问向量3.1.…