嵌入式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.xdnf.cn/news/1472409.html

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

相关文章

利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API

谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro&#xff0c;Gemini 1.5 Pro不仅能够生成创意文本和代码&#xff0c;还能理解、总结上传的图片、视频和音频内容&#xff0c;并且支持高达100万tokens的上下文。在多个基准测试中表现优异&#xff0c;性能超越了ChatGP…

node 下载文件到网络共享目录

1、登录网络共享计算器 2、登录进入后复制要存储文件的目录路径 例如&#xff1a; \\WIN-desktop\aa\bb\cc 3、node 下载后写入网络共享目录 注意&#xff08;重要&#xff09;:在使用UNC路径时&#xff0c;请确保你正确转义了反斜杠&#xff08;使用两个反斜杠来表示一个&…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

跑冒滴漏智能识别摄像机

对于现代城市管理来说&#xff0c;跑冒滴漏智能识别摄像机正逐渐成为解决水管漏水问题和保护城市供水安全的重要工具。这类摄像机通过先进的视觉识别和数据分析技术&#xff0c;能够有效监测和识别城市管道系统中的漏水现象&#xff0c;对于提升供水系统效率和保障城市居民生活…

探寻操作系统文件名字符限制的规则和历史

引言 从最早的电脑系统到现代的操作系统&#xff0c;文件命名的规则一直在不断发展&#xff0c;这些规则体现了不同操作系统设计哲学的差异。作为开发者&#xff0c;了解这些差异和背后的历史渊源非常有价值&#xff0c;本文将详细探讨Windows、macOS和Linux三大主流操作系统在…

栈实现队列与队列实现堆

ok呀&#xff0c;上一篇博客写了队列的相关知识&#xff0c;接下来就是我们提及过的&#xff0c;栈与队列的相互实现了。堆与这个问题咧&#xff0c;其实大家完全可以当一个知识扩展因为&#xff0c;这个问题也是没有太多的实践意义的&#xff0c;更多的是教学意义。所以咧。大…

服务器数据恢复—DS5300存储raid5阵列数据恢复案例

服务器存储数据恢复环境&#xff1a; 某单位一台某品牌DS5300存储&#xff0c;1个机头4个扩展柜&#xff0c;50块硬盘组建2组RAID5磁盘阵列&#xff08;一组raid5阵列有27块成员盘&#xff0c;存放Oracle数据库文件&#xff1b;另外一组raid5阵列有23块成员盘&#xff09;。存储…

Jmeter使用JSON Extractor提取多个变量

1.当正则不好使时&#xff0c;用json extractor 2.提取多个值时&#xff0c;默认值必填&#xff0c;否则读不到变量

c进阶篇(四):内存函数

内存函数以字节为单位更改 1.memcpy memcpy 是 C/C 中的一个标准库函数&#xff0c;用于内存拷贝操作。它的原型通常定义在 <cstring> 头文件中&#xff0c;其作用是将一块内存中的数据复制到另一块内存中。 函数原型&#xff1a;void *memcpy(void *dest, const void…

长难句打卡7.4

But policymakers who refocus efforts on improving well-being rather than simply worrying about GDP figures could avoid the forecasted doom and may even see progress. 但政策制定者们应重新集中精力于提升&#xff08;社会&#xff09;幸福感&#xff0c;而非仅仅担…

Unity 资源 之 Sweet Cakes Icon套装,110个高品质蛋糕图标分享

Sweet Cakes Icon 套装 - 为 Unity 开发者带来甜蜜惊喜 前言资源包内容领取兑换码 前言 亲爱的 Unity 开发者们&#xff0c;今天要向你们介绍一款令人心动的图标套装 - Sweet Cakes Icon。 Sweet Cakes Icon 套装包含了超过 110 种高品质的蛋糕和纸杯蛋糕图标&#xff0c;这无…

鸿蒙开发HarmonyOS NEXT (三) 熟悉ArkTs

一、自定义组件 1、自定义组件 自定义组件&#xff0c;最基础的结构如下&#xff1a; Component struct Header {build() {} } 提取头部标题部分的代码&#xff0c;写成自定义组件。 1、新建ArkTs文件&#xff0c;把Header内容写好。 2、在需要用到的地方&#xff0c;导入…

去中心化 RAG 先行者,KIP Protocol 如何保护数据所有权、激活 AI 资产

AI 时代&#xff0c;人人都应实现 KnowledgeFi 的梦想或许并不遥远&#xff0c;KIP Protocol 正在生动践行这一价值理念&#xff0c;带动去中心化数字产权的创建与盈利&#xff0c;面向 CryptoAI 的蓝海市场迈出创新探索的技术步伐&#xff0c;朝着 Web3 行业打造去中心化 AI 的…

30斤用什么快递便宜?大件物品怎么寄划算省钱?

大学生小李最近因为毕业要搬家&#xff0c;不得不把一堆书籍、衣服和一些生活用品寄回家。作为一个精打细算的“穷学生”&#xff0c;小李可是不愿意在快递费上花冤枉钱的。于是&#xff0c;他开始研究各种寄快递省钱的方法&#xff0c;今天我们就来看看小李是怎么操作的。一、…

一款纯 js 实现的大模型应用服务 FastGPT 解读

背景介绍 最近被不同的人安利了 FastGPT 项目&#xff0c;实际上手体验了一下&#xff0c;使用流程类似之前调研过的 Dify, 包含的功能主要是&#xff1a;任务流的编排&#xff0c;知识库管理&#xff0c;另外还有一些外部工具的调用能力。使用页面如下所示&#xff1a; 实际…

【C++】 解决 C++ 语言报错:Undefined Reference

文章目录 引言 未定义引用&#xff08;Undefined Reference&#xff09;是 C 编程中常见的错误之一&#xff0c;通常在链接阶段出现。当编译器无法找到函数或变量的定义时&#xff0c;就会引发未定义引用错误。这种错误会阻止生成可执行文件&#xff0c;影响程序的正常构建。本…

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一&#xff0e;背景介绍 当今高度数字化和智能化的工业领域&#xff0c;对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来&#xff0c;工业生产过程正经历着前所未有的变革&#xff0c;从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

ETCD 基本介绍与常见命令的使用

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/140171610 文章目录 一、基本介绍1.1 参考1.2 什么是ETCD1.3 ETCD的特点1.4 ETCD的主要功能1.5 ETCD的整体架构1.6 什么时候用ETCD&#xff0c;什么时候用redis 二、安装三、使用3.1 etcdctl3.2 常用…

Camera link(学习笔记)

Camera Link协议是一种专门针对机器视觉应用领域的串行通信协议&#xff0c;它使用低压差分信号(LVDS)进行数据的传输和通信。Camera Link标准是在ChannelLink标准的基础上多加了6对差分信号线&#xff0c;其中4对用于并行传输相机控制信号&#xff0c;另外2对用于相机和图像采…