嵌入式Linux:发送实时信号

embedded/2024/10/19 18:29:07/

目录

1、发送进程

2、接收进程


非实时信号有一个明显的局限性:当同一个信号多次发生时,它只会被记录为一次,且不会记录发生的次数。因此,当该信号被解除阻塞后,它仅会被处理一次。这种行为使得标准信号在某些应用场景下不够灵活。

相比之下,实时信号 提供了几个关键的优势:

  • 信号范围扩大:标准信号仅提供 SIGUSR1SIGUSR2 供用户自定义使用,而实时信号的编号范围更大(SIGRTMINSIGRTMAX,对应编号范围 34~64),可以应用于更多自定义目的。

  • 队列化管理:实时信号采取队列化管理,这意味着如果同一个实时信号多次发生,内核将记录每次事件并按顺序传递,而标准信号只会传递一次。

  • 附带数据:实时信号允许携带附带数据(可以是整型数据或指针),供接收方在信号处理函数中使用,这为信号传递带来了更大的灵活性。

  • 传递顺序保证:当多个不同的实时信号处于等待状态时,信号编号越小的信号会优先传递。如果同一个信号多次发生,传递顺序会与发送顺序保持一致。

为了使用实时信号,通常需要满足以下要求:

  • 发送实时信号:发送进程需要使用 sigqueue() 系统调用发送实时信号及其伴随数据。
  • 接收实时信号:接收进程需要为该信号设置信号处理函数,并在 sigaction 函数中启用 SA_SIGINFO 标志,以确保可以接收伴随数据。

sigqueue() 的函数原型如下:

#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
  • 参数:

    • pid:接收信号的进程 ID。
    • sig:需要发送的信号编号。与 kill() 类似,也可以将 sig 设置为 0 来检查进程是否存在。
    • value:一个 union sigval 类型的值,表示伴随信号传递的数据,可以是整型或指针。
  • 返回值:

    • 成功返回 0;
    • 失败返回 -1,并设置 errno

union sigval 是一个共用体,定义如下:

typedef union sigval {int sival_int;    // 整型数据void *sival_ptr;  // 指针数据
} sigval_t;

1、发送进程

使用 sigqueue() 向另一个进程发送实时信号及其伴随数据。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>int main(int argc, char *argv[]) {union sigval sig_val;int pid, sig;// 检查参数个数if (argc < 3) {exit(-1);}// 获取命令行传递的参数pid = atoi(argv[1]);sig = atoi(argv[2]);printf("Sending signal %d to process %d\n", sig, pid);// 发送信号,附带整型数据sig_val.sival_int = 10;if (sigqueue(pid, sig, sig_val) == -1) {perror("sigqueue error");exit(-1);}puts("Signal sent successfully!");return 0;
}

2、接收进程

使用 sigaction() 绑定实时信号处理函数,并接收伴随数据。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>static void sig_handler(int sig, siginfo_t *info, void *context) {sigval_t sig_val = info->si_value;printf("Received real-time signal: %d\n", sig);printf("Attached data: %d\n", sig_val.sival_int);
}int main(int argc, char *argv[]) {struct sigaction sa = {0};int sig;// 检查参数个数if (argc < 2) {exit(-1);}// 获取命令行传递的信号编号sig = atoi(argv[1]);// 绑定信号处理函数sa.sa_sigaction = sig_handler;sa.sa_flags = SA_SIGINFO;  // 启用 SA_SIGINFO 标志,以接收附带数据if (sigaction(sig, &sa, NULL) == -1) {perror("sigaction error");exit(-1);}// 无限循环,等待信号while (1) {sleep(1);}return 0;
}

标准信号和实时信号在 Linux 信号处理机制中各有优劣。标准信号适用于大多数常见场景,但其无法记录信号的多次发生,且缺少附带数据传递的能力。而实时信号则提供了更灵活的功能,包括多次传递信号、附带数据和保证传递顺序。这些特性使得实时信号在高性能和复杂信号处理需求下尤为有用。


http://www.ppmy.cn/embedded/128805.html

相关文章

如果用Java设计MySQL中表级锁、行级锁和间歇锁会是怎么的?

在 MySQL 中&#xff0c;锁机制是确保数据一致性和并发控制的重要手段。MySQL 支持多种锁类型&#xff0c;包括表级锁、行级锁等&#xff0c;每种锁的适用场景、影响范围和实现机制各不相同。我们将逐一介绍它们&#xff0c;并通过模拟代码展示不同锁的实现。 1. 锁类型及其影…

文心智能体:我的旅游小助手

文章目录 一、全球旅游推荐官&#xff08;旅游小帮手介绍&#xff09;二、为什么会创建全球旅游推荐官呢&#xff1f;1.创意灵感2.实现思路 三、开发步骤和方法四、调试方法和总结五、探索AI未来&#xff0c;开启无限可能&#xff1a;文心智能体平台&#xff0c;智能创新的领航…

PHP $ _FILES [‘userfile‘] [‘name‘ ] 和 $ _FILES [‘userfile‘] [‘tmp_name‘] 有什么区别

在PHP中&#xff0c;当你通过HTML表单上传文件时&#xff0c;PHP会将与上传文件相关的所有信息存储在全局数组$_FILES中。这个数组是一个多维数组&#xff0c;其中包含了关于每个上传文件的详细信息。$_FILES[userfile]是这个多维数组中的一个元素&#xff0c;它代表了名为user…

《OpenCV计算机视觉》——人脸检测__Haar特征、级联分类器

文章目录 Haar特征一、定义与原理二、分类三、计算方法四、应用五、优缺点 级联分类器一、定义与原理二、结构与组成三、举例说明 Haar特征 Haar特征是一种在计算机视觉和图像处理中常用的特征描述方法&#xff0c;特别适用于物体识别&#xff0c;尤其是人脸检测。以下是对Haa…

HDFS开启审计日志

文章目录 HDFS开启审计日志修改 HDFS log4j.properties修改 HDFS hdfs-site.xml修改 HDFS hadoop-env.sh分发配置到NN节点重启NN节点评估 HDFS 审计日志大小 HDFS开启审计日志 修改 HDFS log4j.properties 修改文件大小及保留个数、日志存储目录 vim /opt/apache/hadoop/etc…

openlayers 测量功能实现(测距测面)- vue3

一、配置openlayer环境 借鉴&#xff1a;Vue 3 OpenLayers 的简单使用_vue3 openlayers-CSDN博客 二、代码如下&#xff08;测距、测面和清除&#xff09; measurs.js: import {ref} from vue; import Draw from ol/interaction/Draw import VectorSource from ol/source/…

红队攻防之隐匿真实IP

0x01 前言 安全态势日益严峻&#xff0c;各大组织普遍采用了综合的安全产品&#xff0c;如态势感知系统、WAF和硬件防火墙等&#xff0c;这些措施加大了渗透测试和攻防演练的难度。即使是一些基本的漏洞验证、端口扫描&#xff0c;也可能导致测试IP被限制&#xff0c;从而阻碍…

VGG16

文章目录 VGG161. **图像分类**2. **特征提取**3. **迁移学习**4. **其他应用**5. **结构简单且深度较大**总结&#xff1a; 流程流程总结&#xff1a; 具体介绍1. **特征提取部分 (features)**2. **自适应池化层 (avgpool)**3. **分类器部分 (classifier)**4. **总结** VGG( (…