Linux进程通讯—信号处理

进程通讯—信号处理

signal 系统调用是 UNIX 和类 UNIX 系统(如 Linux)中用于处理信号的一个基础机制。信号是软件中断,它们可以被系统或者进程发送给另一个进程或线程,以通知它们发生了某个事件。这些事件可以是硬件中断(如外部设备请求服务)、软件异常(如除零错误)、用户请求(如用户请求停止进程)等。

1.基本用法

signal 函数的原型定义在 <signal.h> 头文件中,我们可以通过 signal 系统调用注册信号处理函数:

#include <signal.h>
// 信号处理函数声明
typedef void (*sighandler_t)(int);
/**
* signal 系统调用会注册某一信号对应的处理函数。如果注册成功,当进程收到这一
信号时,将不会调用默认的处理函数,而是调用这里的自定义函数
* 
* int signum: 要处理的信号
* sighandler_t handler: 当收到对应的 signum 信号时,要调用的函数
* return: sighandler_t 返回之前的信号处理函数,如果错误会返回 SEG_ERR
*/
sighandler_t signal(int signum, sighandler_t handler);

2.性质

2.1注意事项

  1. 信号处理函数的行为:信号处理函数必须是简单的,并且必须是异步信号安全的。这意味着它只能调用异步信号安全的函数,不能执行那些可能导致死锁或数据竞争的操作,如修改全局变量(除非这些操作是原子的)。
  2. 不可重入性:如果信号处理函数在执行时被中断(例如,通过另一个信号),则原始的处理函数可能会再次被调用,这可能导致不可预测的行为。
  3. 信号掩码:在信号处理函数执行期间,会阻塞(或忽略)与当前信号相同的信号,以避免嵌套调用。但是,这不会影响其他信号。
  4. 可移植性问题:由于不同系统间对信号处理的实现细节可能存在差异,因此使用 signal 函数可能会导致可移植性问题。

2.2替代方案

由于 signal 函数存在上述的缺点,许多现代系统提供了更可靠的替代方案,如 sigaction 函数。sigaction 提供了更详细的控制,包括指定信号屏蔽集、获取信号处理函数以及设置信号处理选项等。

3.测试

//
// Created by root on 2024/9/16.
//
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>void sigint_handler(int signum){printf("捕获到信号%d\n",signum);exit(signum);
}int main(int argc,char *argv[]){if (signal(SIGINT,sigint_handler)==SIG_ERR){perror("signal error");exit(EXIT_FAILURE);}while(1){sleep(1);printf("你好\n");}return 0;
}

在这个示例中,当接收到 SIGINT 信号(通常由用户按下 Ctrl+C 产生)时,sigint_handler 函数会被调用,程序会打印一条消息并退出。

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

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

相关文章

Vue使用axios实现Ajax请求

1、什么是 axios 在实际开发过程中&#xff0c;浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后&#xff0c;官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的介绍…

【Day03-MySQL单表】

数据库 数据库介绍 什么是数据库 数据存储的仓库&#xff0c;其本质也是一个文件系统 数据库会按照特定的格式对数据进行存储&#xff0c;用户可以对数据库中的数据进行增加&#xff0c;修改&#xff0c;删除及查询操作。 数据库管理系统层次 数据库管理系统 (DataBase Ma…

安装python包的四种常用方式

前言 Pycharm使用过程中总是需要根据任务安装一些python的包&#xff0c;有时候还会遇到某些包安装失败&#xff0c;今天总结了四种常见的安装方式&#xff0c;希望在一种方式安装失败的情况下&#xff0c;可以换其他方式进行尝试安装。 一、鼠标点击安装 1. Python Interpre…

qt--Qml控件库如何从外部导入

文章目录 两种方案方案1 给项目添加子项目方案2 使用pri文件 综合来说 &#xff1a; 两种方案 方案1 给项目添加子项目 利用git的特性 对应的子项目就是我们的控件库 然后需要哪个控件 在父项目的qrc路径进行导入 即可将控件库里面的控件给导入项目 在使用的时候 使用模…

通过蓝图Blueprint完成项目拆分、模块化以及模块化后项目结构分析

1、不拆分项目之前的写法 在上一篇Flask入门和视图中我们讲解了Flask项目的一个启动流程&#xff0c;引入Flask、创建Flask对象&#xff0c;然后由路由进入在视图函数中通过模版渲染或者json系列化的方式返回页面或者数据。我们发现这些所有的操作都是在一个页面中完成的&…

不只是模仿,伯克利新研究赋予机器人跨实体自主学习的能力,零样本时代已来

导读&#xff1a; 在当今科技飞速发展的时代&#xff0c;机器人技术正不断地给我们带来惊喜和变革。2024 年 9 月&#xff0c;一篇来自加州大学伯克利分校、丰田研究所和Physical Intelligence 的研究论文RoVi-Aug: Robot and Viewpoint Augmentation for Cross-Embodiment Rob…

C++ | 二叉搜索树

前言 本篇博客讲解c中的继承 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&…

超详细!百分百安装成功pytorch,建议收藏

文章目录 一、Anaconda安装1.1下载anaconda1.2配置Anaconda环境1.3验证anaconda是否安装成功 二、查看电脑显卡三、更新显卡驱动3.1下载驱动3.2、查看显卡驱动版本 四、cuda安装4.1CUDA下载4.2CUDA环境配置4.3验证CUDA是否安装成功 五、安装pytorch4.1下载pytorch5.2验证pytorc…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核&#xff08;LiteOS-M&#xff09; 轻量系统内核&#…

力扣 18.四数之和

文章目录 题目介绍解法 题目介绍 解法 思路和 15. 三数之和 一样&#xff0c;排序后&#xff0c;枚举 nums[a] 作为第一个数&#xff0c;枚举 nums[b] 作为第二个数&#xff0c;那么问题变成找到另外两个数&#xff0c;使得这四个数的和等于 target&#xff0c;这可以用双指针…

《线性代数》常用公式定理总结

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支&#xff01; 前提&#xff1a; 已提交&#xff01; 重点&#xff1a;未推送&#xff01; 要是推送了&#xff0c;再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码&#xff0c;不用往下看了&#xff0c;帮不到你…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

电竞显示器哪个牌子好

电竞显示器哪个好&#xff1f;你想成为电竞选手吗&#xff1f;显示器很关键&#xff0c;下面我就列举7款市面流行的电竞显示器给大家看看&#xff0c;总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》

鱼哥好书分享活动第31期&#xff1a;如何构建出更好的大模型RAG系统&#xff1f;《大模型RAG实战》 S1 初级RAGS2 高级RAG模型测策略测模型微调测 S3 超级RAG购买链接&#xff1a;内容简介&#xff1a;赠书抽奖规则: ChatGPT爆火之后&#xff0c;以ChatPDF为首的产品组合掀起了…

Node-red 某一时间范围内满足条件的数据只返回一次

厂子里有个业务需求增加一段逻辑&#xff0c;根据点位数值&#xff0c;判断是否让mes执行之后的逻辑。 网关采集周期5s/次&#xff0c;及数据上报周期5s/次; iot通过网关写入时间为8s左右&#xff1b; 同类设备共用一条规则链&#xff1b; 想当触发条件时修改”完成上传“不…

简单题67.二进制求和 (java)20240919

题目描述&#xff1a; Java&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();int i a.length()-1;int j b.length()-1;int carry 0; //记录进位信息while(i>0 || j>0 || carry!0){int sum ca…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知&#xff1a; Request 类 1. 构造函数 2. 序列化函数&#xff1a;Serialize() 3. 反序列化函数&#xff1a;DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数&#xff1a;…

免费下载PDF | 自然语言处理新范式:基于预训练模型的方法

前言 本次给大家推荐阅读的书籍是——《自然语言处理&#xff1a;基于预训练模型的方法》。近些年来&#xff0c;以GPT、BERT为代表的预训练模型在自然语言处理领域掀起了一股浪潮&#xff0c;打开了“预训练精调”的自然语言处理新范式的大门。 由电子工业出版社出版的《自然…

动手学深度学习(pytorch土堆)-06损失函数与反向传播、模型训练、GPU训练

模型保存与读取 完整模型训练套路 import torch import torchvision.datasets from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom model impo…