嵌入式Linux系统编程 — 6.7 实时信号

目录

1 什么是实时信号

2 sigqueue函数

3 sigpending()函数


1 什么是实时信号

等待信号集只是一个掩码,它并不追踪信号的发生次数。这意味着,如果相同的信号在被阻塞的状态下多次产生,它只会在信号集中被记录一次,并且在信号集被检查时仅被视为一个事件。这是标准信号的缺点之一。

与标准信号不同,实时信号可以排队,如果同一个实时信号多次发送给同一个进程,它们将被排队处理,而不是像标准信号那样只能触发一次。实时信号较之于标准信号,其优势如下:

  • 可排队: 实时信号可以排队等待处理,如果一个信号多次到达,它只会被处理一次,除非它被显式地从队列中移除并重新发送。
  • 优先级队列: 实时信号具有与信号相关联的默认实时优先级。如果一个实时信号被发送,它将按照其优先级顺序处理,这有助于确保高优先级的信号能够及时被处理。

  • 应用定义的处理: 实时信号可以有应用程序定义的处理函数,类似于传统信号,但是它们可以安全地使用在多线程环境中。

  • 不干扰传统信号: 实时信号与标准信号(如 SIGKILLSIGSTOP)分开处理,因此不会受到这些信号的影响。

Linux 内核定义了 31 个不同的实时信号,信号编号范围为 34~64,使用 SIGRTMIN 表示编号最小的实时信号,使用 SIGRTMAX 表示编号最大的实时信号,其它信号编号可使用这两个宏加上一个整数或减去一个整数。

应用程序当中使用实时信号,需要有以下的两点要求:

  • 发送进程使用 sigqueue()系统调用向另一个进程发送实时信号以及伴随数据。

  • 接收实时信号的进程要为该信号建立一个信号处理函数,使用sigaction函数为信号建立处理函数,并加入 SA_SIGINFO,这样信号处理函数才能够接收到实时信号以及伴随数据,也就是要使用sa_sigaction 指针指向的处理函数,而不是 sa_handler,当然允许应用程序使用 sa_handler,但这样就不能获取到实时信号的伴随数据了。

2 sigqueue函数

sigqueue() 函数是用于发送实时信号给指定进程的 POSIX 函数。实时信号是 POSIX 1003.1b 标准的一部分,它们允许发送者指定信号的属性,如信号值和与之关联的数据。函数原型如下:

#include <signal.h>int sigqueue(pid_t pid, int sig, const union sigval value);
  • pid:接收信号的进程的进程 ID。如果 pid 为负值,信号将发送给指定会话中的所有进程。
  • signum:要发送的信号的编号。它应该是 SIGRTMIN 到 SIGRTMAX 之间的值,表示一个实时信号。
  • value:参数 value 指定了信号的伴随数据, union sigval 数据类型。
  • 返回值:成功时返回 0,失败时返回 -1,并设置 errno 以指示错误。

union sigval 数据类型(共用体) 如下所示:

typedef union sigval
{int sival_int;void *sival_ptr;
} sigval_t;

下面的示例代码是一个基本的父子进程通信程序,其中父进程使用 sigqueue 函数向子进程发送一个信号和附加数据。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main() 
{pid_t pid = fork(); // 创建子进程if (pid == -1) {perror("fork failed");exit(EXIT_FAILURE);}if (pid == 0) {// 子进程printf("Child process is waiting for signal...\n");pause(); // 子进程挂起,等待信号exit(EXIT_FAILURE); // 确保子进程在接收信号前不会退出} else {// 父进程printf("Parent process is sending signal to child...\n");sleep(2); // 让子进程先打印等待信息// 声明sigval变量并初始化union sigval value;value.sival_ptr = "Hello from parent!"; // 设置信号值if (sigqueue(pid, SIGUSR1, value) == -1) {perror("sigqueue failed");exit(EXIT_FAILURE);}printf("Signal sent successfully.\n");int status;waitpid(pid, &status, 0); // 等待子进程结束if (WIFEXITED(status)) {printf("Child exited with status %d\n", WEXITSTATUS(status));}}return 0;
}

在这段代码中,父进程首先创建了一个子进程,然后子进程调用 pause 进入等待状态,直到接收到信号。父进程在稍作延时后使用 sigqueue 发送 SIGUSR1 信号给子进程,并附带一个 sigval 类型的联合体,其中 sival_ptr 成员指向一个字符串 "Hello from parent!"。如果 sigqueue 调用成功,父进程将打印一条成功消息,并等待子进程结束。父进程随后检查子进程的退出状态,并打印出来。

3 sigpending()函数

sigpending 函数用于查询系统中挂起(pending)的信号集,挂起的信号是指那些已经发送给进程,但尚未被进程处理的信号。函数原型如下:

#include <signal.h> int sigpending(set_t *set);
  • set_t:处于等待状态的信号会存放在参数 set 所指向的信号集中。

下面是一个简单的使用 sigpending 函数的示例:

#include <stdio.h>
#include <signal.h>
#include <errno.h>int main() 
{sigset_t pending_set;// 检查错误if (sigpending(&pending_set) == -1) {perror("sigpending failed");return 1;}// 检查特定信号是否挂起if (sigismember(&pending_set, SIGINT)) {printf("SIGINT is pending.\n");} else {printf("SIGINT is not pending.\n");}return 0;
}

在这个示例中,程序首先调用 sigpending 来获取当前挂起的信号集,然后使用 sigismember 函数检查 SIGINT是否在挂起信号集中。如果 SIGINT 信号挂起,程序将打印相应的消息。如果 sigpending 调用失败,程序将打印错误信息并返回。

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

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

相关文章

Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件

就是想试试看MSYS2 能兼容到什么地步。自己做了个RP2040 板子&#xff0c;用了4MB 的Flash&#xff0c;默认的Micropython 固件是2MB 的&#xff0c;所以只能自己编译固件。 编译环境 MSYS2 的安装方法、基本配置什么的我就不管了&#xff0c;到处都有文章介绍这个。只提一点…

mac视频压缩简单办法,mac如何把视频压缩到指定大小内存

在数字时代&#xff0c;视频已成为我们日常生活和工作的重要交流工具。然而&#xff0c;视频文件体积庞大&#xff0c;给存储和分享带来了不少困扰。本文将为你揭秘视频压缩的秘密&#xff0c;让你轻松减小视频文件体积&#xff0c;提升分享效率&#xff01; 方法一下载文件压缩…

Vue3实现过渡动画

认识动画 在开发中&#xff0c;我们想要给一个组件的显示和消失添加某种过渡动画&#xff0c;可以很好的增加用户体验&#xff1a; React框架本身并没有提供任何动画相关的API&#xff0c;所以在React中使用过渡动画我们需要使用一个第三方库 react-transition-group&#xf…

【高中数学/极值问题】一条长为L的绳子,一面靠墙,另外三边组成矩形,问此矩形最大面积能是多少?

【问题】 一条长为L的绳子&#xff0c;一面靠墙&#xff0c;另外三边组成矩形&#xff0c;问此矩形最大面积能是多少&#xff1f; 【示意图】 【解析式】 设垂直于墙的两边长为x&#xff0c;则墙对边长为L-2x&#xff0c;围成的矩形面积Sx(L-2x) 写成标准的解析式为yx(L-2…

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1&#xff1a;直接搜索 在电脑的搜索栏&#xff0c;输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”&#xff0c;打开 远程桌面连接 方式2&#xff1a;运行框打开服务器连接 同时按&#xff1a;Windows徽标键…

java+springboot+Mysql“友书”综合书籍平台系统24489-计算机毕业设计项目选题推荐(附源码)

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;“友书”综合书籍平台当然也不能排除在外。“友书”综合书籍平台系统是以实际运用为开发背景&#xff0c;运用软件工程原…

搜维尔科技:详谈ART的工具追踪技术

您的生产流程中是否已经受益于刀具跟踪系统&#xff1f;您是否意识到它们的价值&#xff1f;因为它们可以优化您的装配顺序&#xff0c;从而节省您的时间和金钱。 目前我们提供两种工具跟踪解决方案&#xff1a; 1.ART与 VERPOSE的解决方案——易于使用的图像识别 安装在工…

UE5 05-利用 timeline 插值运动

理解成 unity Dotween DoMove 插值运动即可 AddTimeLine 节点 物体插值运动 物体插值缩放 一个timeline 可以K多个动画帧

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

DT浏览器很好用

DT浏览器是一款简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;软件使用流畅。DT浏览器的网址收藏&#xff0c;人工智能写作&#xff0c;书法笔记等功能与众不同。DT浏览器的图文识别功能和笔记本搭配使用&#xff0c;可以对内容编辑修改和保存…

RestTemplate、MockMVC、Swagger

rest代码风格 硬编码的部分在实际开发中都是会替换成枚举对象 SpringMVC会自动把json格式的post请求转化为对应接收的 对象 响应请求时&#xff0c;也会自动把 对象转化为 json格式的 RestTemplate 浏览器的地址栏只能提供get请求访问后端&#xff0c;如果要使用post方式发送…

[A-03] ARMv8/ARMv9-多级Cache架构

ver 0.1 前言 前面文章我介绍了Cache的基本架构、Cache的详细的结构&#xff0c;有了一定的cache的基础&#xff0c;对cache机制也有了sense。实际上Cache作为CPU架构中存储机制的核心组件和CPU的微架构以及系统的总线架构还是密切相关的&#xff0c;不同的体系下&#xff0c…

传统数据处理系统存在的问题

传统应用的数据系统架构设计时&#xff0c;应用直接访问数据库系统。当用户访问量增加时&#xff0c;数据库无法支撑日益增长的用户请求的负载&#xff0c;从而导致数据库服务器无法及时响应用户请求&#xff0c;出现超时的错误。 出现这种情况以后&#xff0c;在系统架构上就采…

【Axure高保真原型】中继器表格——移入显示详情卡片案例

今天和大家分享中继器表格——移入显示详情卡片的原型模板&#xff0c;鼠标移入员工号或姓名会弹出员工卡片&#xff0c;可以查看更详细的信息。这个表格是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要维护中继器表格里的信息&#xff0c;即可自动生成交互效…

第一百四十二节 Java数据类型教程 - Java字符数据类型

Java数据类型教程 - Java字符数据类型 Character类的一个对象包装一个char值。 字符类包含isLetter()和isDigit()方法来检查字符是否为字母和数字。 toUpperCase()和toLowerCase()方法将字符转换为大写和小写。 该类提供了一个构造函数和一个工厂valueOf()方法来从char创建对…

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本&#xff08;helm部署&#xff09; 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

[激光原理与应用-98]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 2 - 什么是激光器焊接

目录 一、什么是激光焊接 1.1 概述 1.2 激光焊接的优点 二、激光焊接的应用 2.1 哪些场合必须使用激光焊接 1. 汽车制造业 2. 航空航天领域 3. 电子行业&#xff1a;消费类电子3C 4. 医疗器械制造 5. 新能源锂电池行业 6. 其他领域 三、激光焊接的分类 3.1 按焊接…

【靶机实战】Apache Log4j2命令执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> Log4j2-RCE 原文&#xff1a;【靶机实战】Apache Log4j2命令执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 Apache Log4j2 是一个广泛使用的 Java 日志记录库&#…

【ROS2】初级:CLI工具- 理解话题(或主题)

理解话题 目标&#xff1a;使用 rqt_graph 和命令行工具来内省 ROS 2 话题。 教程级别&#xff1a;初学者 时间&#xff1a;20 分钟 目录 背景 先决条件 任务 设置2 rqt_graph3 ros2 话题列表4 ros2 话题回声5 ros2 话题信息6 ros2 接口显示7 ros2 话题发布8 ros2 话题赫兹 清理…