Linux系统编程(传统信号和实时信号)

news2024/10/6 18:22:32

文章目录

  • 前言
  • 一、传统信号和实时信号概念
  • 二、重要函数介绍
  • 三、实时信号和传统信号被处理的次数
  • 总结


前言

本篇文章我们来讲解传统信号和实时信号,这里我们将从实际应用给大家讲解。

一、传统信号和实时信号概念

传统信号(Traditional Signals):

传统信号是Unix系统早期定义的信号类型,被称为标准信号(Standard Signals)。

传统信号的范围是1到31,用整数方式表示,例如,SIGINT 是2,SIGALRM 是14。

传统信号的处理方式是异步的,即信号发送后立即触发信号处理程序执行,中断当前进程的正常执行流程。

传统信号的处理程序是函数指针,可以由进程注册自定义的信号处理函数,用于在接收到信号时执行特定的操作。

如果进程没有为某个信号注册处理函数,操作系统将采用默认的处理方式,例如终止进程、忽略信号或者产生核心转储文件。

实时信号(Real-Time Signals):

实时信号是在POSIX.1b标准中引入的一种更高级的信号机制。

实时信号的范围是从实时信号1(SIGRTMIN)到实时信号31(SIGRTMAX),共计64个信号。

实时信号的处理方式可以是同步的或异步的,具体取决于进程设置的信号发送和接收机制。

实时信号的处理程序是函数指针,可以由进程注册自定义的信号处理函数,用于在接收到信号时执行特定的操作。

实时信号的一个重要特点是可以传递一个整数值作为附加数据,这使得实时信号在进程间通信中非常有用。

实时信号相对于传统信号具有更高的灵活性和可靠性,且能够提供更细粒度的信号处理。传统信号在某些情况下可能会发生竞争条件或丢失信号的问题,而实时信号可以帮助解决这些问题。

二、重要函数介绍

1.sigfillset()函数:

int sigfillset(sigset_t *set);

sigfillset()函数将在指定的信号集 set 中设置所有的信号,相当于创建一个包含系统上所有信号的完整集合。信号集 set 会被填充满。

2.sigaddset()函数:

int sigaddset(sigset_t *set, int signum);

sigaddset()函数用于将指定的信号 signum 添加到信号集 set 中。这允许我们将多个信号添加到信号集中,以便后续对其进行操作。

3.sigdelset()函数:

int sigdelset(sigset_t *set, int signum);

sigdelset()函数用于从信号集 set 中删除指定的信号 signum。这个函数可以用来从信号集中删除不再感兴趣的信号。

sigemptyset()函数:

int sigemptyset(sigset_t *set);

sigemptyset()函数用于清空信号集 set,即将所有信号从信号集中删除,使其成为空集。

sigprocmask()函数:

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

sigprocmask()函数用于设置进程的信号屏蔽字,控制哪些信号可以传递给进程或阻塞进程对信号的接收。

参数 how 指定了信号屏蔽字的操作方式,可以是以下三个值之一:

SIG_BLOCK:将 set 中的信号添加到进程的信号屏蔽字中。

SIG_UNBLOCK:从进程的信号屏蔽字中移除 set 中的信号。

SIG_SETMASK:设置进程的信号屏蔽字为 set。

参数 set 指定了要添加、删除或设置的信号集。
参数 oldset 是一个可选参数,用于存储之前的信号屏蔽字。

三、实时信号和传统信号被处理的次数

在处理传统信号时,操作系统默认情况下只保留一个挂起的信号。如果在处理信号时,相同类型的信号再次到达进程,且之前的信号尚未处理完毕,则后续到达的信号会被丢弃。

实时信号使用了队列的机制,即使在处理实时信号时,多个相同类型的信号会被排队等待处理。
实时信号有一个优先级的概念,具有更高优先级的实时信号会在低优先级实时信号之前得到处理。

代码实验:

接收端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>

static int g_count = 0;//计数值
static int g_sig = 0;//信号值

void signal_Handle(int sig, siginfo_t* info, void* ucontext)
{
    if(sig = g_sig)
    {
        g_count++;
    }
}

int main(int argc, char** argv)
{
    int i = 0;
    printf("pid :%d\n", getpid());
    sigset_t set = {0};

    g_sig = atoi(argv[1]);

    struct sigaction act = {0};

    act.sa_sigaction = signal_Handle;
    act.sa_flags = SA_RESTART | SA_SIGINFO;

    /* 添加信号屏蔽字 */
    /* 下面信号在信号处理程序执行时会被暂时阻塞 */
    sigaddset(&act.sa_mask, g_sig);

    /* 设置信号的处理行为,设置后40和SIGINT信号将由act里面的信号处理函数处理 */
    sigaction(g_sig, &act, NULL);
    sigaction(SIGINT, &act, NULL);

    /* 屏蔽所有信号 */
    sigfillset(&set);
    sigprocmask(SIG_SETMASK, &set, NULL);

    for(i = 0; i < 15; i++)
    {
        printf("i : %d\n", i);
        sleep(1);
    }

    /* 解除所有屏蔽 */
    sigemptyset(&set);
    sigprocmask(SIG_SETMASK, &set, NULL);    

    printf("g_count = %d\n", g_count);

    return 0;
}

发送端:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>


int main(int argc, char** argv)
{
    pid_t pid = atoi(argv[1]);
    int sig = atoi(argv[2]);
    int i = 0;

    union sigval sv = {123456};
    
    for(i = 0; i < 15000; i++)
    {
        sigqueue(pid, sig, sv);
    }

    raise(SIGINT); 

    return 0;
}

实时信号:
在这里插入图片描述
传统信号:
在这里插入图片描述
从上面的运行结果可以直接看出来:实时信号不会丢失,而传统信号则会丢失。

总结

本篇文章就讲解到这里,下篇文章见。

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

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

相关文章

spring boot学习第一篇:spring boot 1.5.x版本启动接口服务

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

华为云出品《IDEA-Plugin-开发手册》电子书——学完即会场景设计

小智又来给各位开发者送书啦&#xff01; 助力各位开发者们提升技能 海量案例串联 IEDA Plugin 插件开发技能 重实践与验证帮助避免踩坑 学完就可自己完成一些场景设计和开发 适合有一定编程基础&#xff0c;1年以上经验的开发者 适合对IDEA Plugin有学习需求或想拓展业务…

出海企业系列风险分析--网站需要验证码吗?

最近接待了几位从discuz来的用户&#xff0c;说是想要给自己海外的网站安装验证码&#xff0c;但是discuz境外服务器还要解析安装中心的DNS到境外服务器上&#xff0c;所以基于discuz建站的不好之处就在这里。 而且我们还讨论到一个问题&#xff0c;海外的网站&#xff0c;需要…

【线程概念和线程控制】

目录 1 :peach:线程概念 :peach:1.1 :apple:什么是线程&#xff1f;:apple:1.2 :apple:线程的优点和缺点:apple:1.3 :apple:页表的大小:apple:1.4 :apple:线程异常和用途:apple:1.5 :apple:进程VS线程:apple: 2 :peach:线程控制:peach:2.1 :apple:POSIX线程库:apple:2.2 :apple…

tp6的runtime/Logs目录下产生大量日记文件,怎么取消自动生成?

一开始查了好多网上提供的&#xff0c;很幸运都是抄袭别人的&#xff0c;没一个成功&#xff0c;最后无奈只能自己解决方法 其实很简单&#xff0c;不用修改config/log.php文件&#xff0c;没用因为只要有登入错误&#xff0c;警告&#xff0c;消息或者sql错误都会写入 解决方…

windows编译poco c++库

背景 最近有了解到poco c库&#xff0c;这里记录下编译及使用过程。 最开始使用的vs studio 2022 和 poco 1.12.4版本编译&#xff0c;不管openssl 使用哪种版本&#xff0c;都会编译报错&#xff0c;最后妥协了。 参考&#xff1a;https://www.bilibili.com/read/cv1416565…

《语文新读写》期刊简介及投稿邮箱

《语文新读写》期刊简介&#xff1a; 《语文新读写》是“国家期刊奖”获奖期刊&#xff0c;中国期刊方阵双效期刊&#xff0c;中国核心期刊&#xff08;遴选&#xff09;数据库收录期刊&#xff0c;被授予上海市期刊优秀编辑部。杂志的主要读者对象为各大院校、中小学各科教师…

安全帽佩戴检测算法模型训练详细流程

一、任务描述 实际施工现场需要对每个进出的人员进行安全帽监测&#xff0c;对未佩戴安全帽的人员平台进行风险告警&#xff0c;通知工作人员并记录下来。 主要包括三类目标物体&#xff1a;头盔&#xff08;helmet&#xff09;&#xff0c;人&#xff08;person&#xff09;…

100种思维模型之耗散结构理论思维模型-96

避免熵死的方法之一就是建立 耗散结构 。 那么&#xff0c;何谓耗散结构理论&#xff1f; 01、何谓耗散结构思维模型‍‍‍ 一、耗散结构理论 1969年&#xff0c;比利时学者 伊里亚普利高津 在对热力学第二定律研究的基础上&#xff0c;提出了 “耗散结构理论”。 他认…

【导航电子地图(MAP)模块功能】

Map功能&#xff1a;提供导航系统中地图描画、地图操作、地图检索的功能。 地图操作功能&#xff1a;地图滚动等。 地图检索功能&#xff1a;附近名称取得、View内检索等。 地图描画功能&#xff1a;是指从地图Data base中读出地点情报&#xff0c;然后按照一定的风格&#…

Meta提出全新参数高效微调方案,仅需一个RNN,Transformer模型GPU使用量减少84%!

近来&#xff0c;随着ChatGPT和GPT-4模型的不断发展&#xff0c;国内外互联网大厂纷纷推出了自家的大语言模型&#xff0c;例如谷歌的PaLM系列&#xff0c;MetaAI的LLaMA系列&#xff0c;还有国内公司和高校推出的一些大模型&#xff0c;例如百度的文心一言&#xff0c;清华的C…

vue3中通过vue-i18n实现国际化

效果图 前言 突然想在vue3项目中使用国际化功能&#xff0c;查阅相关资料后发现和vue2的用法有些出入&#xff0c;记录一下 使用 下载vue-i18n npm i vue-i18n2、准备语言文件 目前我的项目只支持中英文切换&#xff0c;故准备一份中文文件和一份对应的英译文件 创建langur…

七大排序算法——直接插入排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、直接插入排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#…

【Java进阶之路】NIO基础

一、NIO基础 Java New IO是从Java1.4版本开始引入的一个新的IO api&#xff0c;可以替代以往的标准IO&#xff0c;NIO相比原来的IO有同样的作用和目的&#xff0c;但是使用的方式完全不一样&#xff0c;NIO是面向缓冲区的&#xff0c;基于通道的IO操作&#xff0c;这也让它比传…

美团外卖智能陪伴型导购的探索与实践

相比于其他电商场景&#xff0c;外卖场景对于实时发现和反馈用户兴趣的能力有着更高的要求。近年来&#xff0c;美团外卖算法团队摸索出了一套适用于外卖场景的智能陪伴型导购架构和策略。这一举措已经取得了显著成效&#xff0c;本文将详细介绍外卖搜索技术团队搭建智能陪伴型…

Redis数据结构 — IntSet

目录 整数集合IntSet结构设计 IntSet的升级操作 升级具体过程 升级具体源码 小结 IntSet是Redis中set集合的一种实现方式&#xff0c;基于整数数组来实现&#xff0c;并且具备长度可变、有序等特征。 整数集合IntSet结构设计 整数集合本质上是一块连续内存空间&#xff…

Ubuntu22.04安装飞书

通过以下教程可以快速的安装飞书。 安装包下载 进入飞书下载官网下载飞书Linux客户端 选择deb格式安装包下载 安装方式 方式一&#xff1a;运行安装包安装 双击deb文件&#xff0c;点击install进行安装 方式二&#xff1a;终端命令安装 到安装目录&#xff0c;然后dpkg你的安…

光速吟唱,Clibor ,批量多次复制依次粘贴工具 快捷输入软件教程

批量多次复制依次粘贴工具 批量复制粘贴工具0.81.exe https://www.aliyundrive.com/s/3sbBaGmHkb8 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 青县solidworks钣金设计培训 …

Web3.0:重新定义数字资产的所有权和交易方式

随着区块链技术的发展和应用&#xff0c;数字资产的概念已经逐渐深入人心。数字资产不仅包括加密货币&#xff0c;还包括数字艺术品、虚拟土地、游戏道具等各种形式的数字物品。然而&#xff0c;在传统的互联网环境下&#xff0c;数字资产的所有权和交易方式往往受到限制和约束…

二极管总结

目录 1.2.2二极管的伏安特性 1.2.3二极管的主要参数 1.2.4二极管的等效电路 1.2.5稳压二极管 1.2.6其它类型二极管 1.2.2二极管的伏安特性 二极管和PN结伏安特性区别&#xff1a; 相同点&#xff1a;同样具有单向导电性 不同点&#xff1a;二极管存在半导体体电阻和引线电阻…