当前位置: 首页 > news >正文

【Linux基础(三)】信号

学习分享

  • 1、信号的基本概念
  • 2、查看信号列表
  • 3、常见信号名称
  • 4、signal库函数
  • 5、发送信号kill
  • 6、kill - signal (无参信号)示例
    • 6.1、kill - signal (不可靠信号)示例
    • 6.2、kill - signal (可靠信号)示例
  • 7、信号分类
    • 7.1、信号运行原理分类
    • 7.2、信号是否携带数据分类
  • 8、sigaction库函数
  • 9、sigqueue库函数
  • 10、sigaction - sigqueue(带参信号)示例
  • 11、屏蔽信号
    • 11.1、信号集操作函数
    • 11.2、sigprocmask函数
    • 11.3、屏蔽信号示例
  • 12、信号冲突
    • 12.1、信号冲突示例
    • 12.2、信号冲突解决方案示例

1、信号的基本概念

信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。
信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等
它们由shell和终端管理器产生以引起中断。
进程可以生成信号、捕捉并响应信号或屏蔽信号

2、查看信号列表

使用命令:kill -l 查看信号列表

CTRL+C 就是向进程发送2号信号

在这里插入图片描述

  • 1-31为系统信号
  • 34-64为扩展信号,提供开发人员使用

3、常见信号名称

信号的名称是在头文件 signal.h里定义的

在这里插入图片描述
在这里插入图片描述

  • SIGUSR1 和SIGUSR2没有任何含义,由开发人员自由定义

4、signal库函数

类型QT中的connect
在这里插入图片描述

5、发送信号kill

类似QT中的emit
在这里插入图片描述

6、kill - signal (无参信号)示例

在这里插入图片描述

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void signal_function(int num)/信号处理函数
{cout<<"pid = "<<getpid()<<"信号处理函数被触发"<<endl;
}
int main()
{//信号的注册绑定signal(SIGUSR1,signal_funcion);pid_t pid =fork();if(pid>0){//父进程sleep(5);//发送信号kill(pid,SIGUSR1);while(1){}}else {//子进程while(1){cout<<"子进程pid = "<<getpid()<<endl;sleep(1);}}return 0;
}

6.1、kill - signal (不可靠信号)示例

1-31为不可靠信号,连续发送多次,响应1次。不会连续触发处理函数调用,但是间隔发送就会挨个处理。带有操作系统分配的特殊含义

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void signal_function(int num)/信号处理函数
{cout<<"pid = "<<getpid()<<"信号处理函数被触发"<<endl;
}
int main()
{//信号的注册绑定signal(SIGUSR1,signal_funcion);pid_t pid =fork();if(pid>0){//父进程sleep(5);for(int i=0;i<3;i++){cout<<"i = "<<i<<endl; //发送信号kill(pid,SIGUSR1);sleep(1);}while(1){}}else {//子进程while(1){cout<<"子进程pid = "<<getpid()<<endl;sleep(1);}}return 0;
}

6.2、kill - signal (可靠信号)示例

34-64为可靠信号,连续发送会连续触发处理函数调用

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void signal_function(int num)/信号处理函数
{cout<<"pid = "<<getpid()<<"信号处理函数被触发"<<endl;
}
int main()
{//信号的注册绑定signal(SIGUSR1,signal_funcion);pid_t pid =fork();if(pid>0){//父进程sleep(5);for(int i=0;i<3;i++){cout<<"i = "<<i<<endl; //发送信号kill(pid,SIGRTMIN);}while(1){}}else {//子进程while(1){cout<<"子进程pid = "<<getpid()<<endl;sleep(1);}}return 0;
}

7、信号分类

7.1、信号运行原理分类

  1. 1-31不可靠信号:连续发送不会连续触发处理函数调用,但是间隔发送就会挨个处理,带有操作系统分配的特殊含义
  2. 34-64可靠信号:连续发送会连续触发处理函数调用

7.2、信号是否携带数据分类

1、无参信号:signal - kill
2、携带参数信号 :sigaction - sigqueue

8、sigaction库函数

Linux中查看函数详情命令:man sigaction

在这里插入图片描述

9、sigqueue库函数

Linux中查看函数详情命令:man sigqueue

在这里插入图片描述

10、sigaction - sigqueue(带参信号)示例

#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;void sigaction_fuction(int num,siginfo_t* info, void*vo)	//num指信号编号
{int  res= info->si_int;cout<<"pid = "<<getpid()<<"信号处理函数被触发 res="<<res<<endl;
}
int main()
{struct sigaction act;act.sa_sigaction =sigaction_function://带参信号处理函数act.sa_flags = SA_SIGINFO;//当前信号带参数sigction(SIGUSR1,&act,NULL);//带参信号的绑定pid_t pid =fork();if(pid>0){//父进程sleep(5);//带参信号发送union sigval val;//联合体val.sival_int =1001;sigqueue(pid,SIGUSR1,val);while(1){}}else {//子进程while(1){cout<<"子进程pid = "<<getpid()<<endl;sleep(1);}}return 0;
}

11、屏蔽信号

11.1、信号集操作函数

在这里插入图片描述

11.2、sigprocmask函数

在这里插入图片描述
在这里插入图片描述

11.3、屏蔽信号示例

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
using namespace std;
void sigaction_fuction(int num,siginfo_t* info, void*vo)	//num指信号编号
{int  res= info->si_int;cout<<"pid = "<<getpid()<<"信号处理函数被触发 res="<<res<<endl;
}
int main()
{struct sigaction act;act.sa_sigaction =sigaction_function://带参信号处理函数act.sa_flags = SA_SIGINFO;//当前信号带参数sigction(SIGUSR1,&act,NULL);//带参信号的绑定pid_t pid =fork();if(pid>0){//父进程sleep(5);//带参信号发送union sigval val;//联合体val.sival_int =1001;sigqueue(pid,SIGUSR1,val);while(1){}}else {//子进程//屏蔽信号//创建信号集sigset_t array;//初始化信号集sigemptyset(&array);//添加需要屏蔽的信号sigaddset(&array,SIGUSR1);sigaddset(&array,SIGUSR2);//启用信号“黑名单”if(sigprocmask(SIG_BLOCK,&array,NULL)<0){perror("sigprocmask error");}while(1){cout<<"子进程pid = "<<getpid()<<endl;sleep(1);}}return 0;
}

12、信号冲突

当一个进程接收到一个信号,去执行该信号的处理函数,但是信号处理函数还没执行完,就收到另一个信号。

12.1、信号冲突示例


#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
using namespace std;
void test1(int num)	
{cout<<"test1开始运行"<<endl;sleep(30);cout<<"test1结束运行"<<endl;
}
void test2(int num)
{cout<<"test2 运行 ....."<<endll;
}
int main()
{struct sigaction act1;act.sa_sigaction =test1:act1.flags = 0;//无参信号struct sigaction act2;act.sa_sigaction =test2;act2.flags =0;//无参信号sigction(SIGUSR1,&act1,NULL);sigction(SIGUSR2,&act2,NULL);while(1){cout<<"进程pid = "<<getpid()<<endl;sleep(1);}return 0;
}

在这里插入图片描述

12.2、信号冲突解决方案示例


#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
using namespace std;
void test1(int num)	
{cout<<"test1开始运行"<<endl;sleep(30);cout<<"test1结束运行"<<endl;
}
void test2(int num)
{cout<<"test2 运行 ....."<<endll;
}
int main()
{struct sigaction act1;act.sa_sigaction =test1:act1.flags = 0;//无参信号struct sigaction act2;act.sa_sigaction =test2;act2.flags =0;//无参信号//信号1在处理时不希望信号2来打扰//所以在信号1的struct  sigaction结构体中拉黑了信号2sigemptyset(&(act1.sa_mask));//将act1.sa_mask设置为空信号集。//将SIGUSR2信号添加到act1.sa_mask中。sa_mask成员用于指定在执行信号处理函数时需要阻塞的信号集合。sigaddset(&(act1.sa_mask),SIGUSR2);sigction(SIGUSR1,&act1,NULL);sigction(SIGUSR2,&act2,NULL);while(1){cout<<"进程pid = "<<getpid()<<endl;sleep(1);}return 0;
}

相关文章:

【Linux基础(三)】信号

学习分享 1、信号的基本概念2、查看信号列表3、常见信号名称4、signal库函数5、发送信号kill6、kill - signal &#xff08;无参信号&#xff09;示例6.1、kill - signal (不可靠信号)示例6.2、kill - signal (可靠信号)示例 7、信号分类7.1、信号运行原理分类7.2、信号是否携带…...

GEE图像可视化常用函数

目录 图层操作Map.addLayer&#xff08;&#xff09;Map.centerObject&#xff08;&#xff09; 直方图ui.Chart.image.histogram&#xff08;&#xff09; 时间序列统计ui.Chart.image.series&#xff08;&#xff09;ui.Chart.image.seriesByRegion&#xff08;&#xff09; …...

c++基础语法

文章目录 前言命名空间命名空间的使用 缺省参数缺省参数的使用 函数重载函数重载的作用函数重载的使用函数重载原理 引用引用的使用引用的使用场景引用和指针 extern Cinlineauto范围fornullptr 前言 大家好我是jiantaoyab&#xff0c;这篇文章给大家带来的是c语言没有的一些特…...

【工作实践-07】uniapp关于单位rpx坑

问题&#xff1a;在浏览器页面退出登录按钮上“退出登录”字样消失&#xff0c;而在手机端页面正常;通过查看浏览器页面的HTML代码&#xff0c;发现有“退出登录”这几个字&#xff0c;只不过由于样式问题&#xff0c;这几个字被挤到看不见了。 样式代码中有一行为&#xff1a…...

服务层组件

目录 连接层(Connection Pool) SQL接口(SQL Interface) 查询缓存(Caches&Buffers) Management Services&Utilities 查询分析器(Parser) 优化器(Optimizer)...

【学习笔记】VMware vSphere 6.7虚拟化入门

VMware vSphere 6.7虚拟化入门课程介绍 课程内容 1、VMware vSphere 6.7虚拟化入门课程介绍 2、ESXi6.7控制台设置 3、使用vSpkere Host client管理虚拟机 4、VMware EsXi基础操作 5、VMware Esxi存储管理 6、管理ESXi主机网络与虚拟机网络 7、安装配置vCenter Server Applia…...

如何防范企业内部安全威胁?

1 用户行为分析&#xff08;UEBA&#xff09; 现代化的用户行为分析产品具有多种优势功能&#xff0c;使企业能够有效地检测内部威胁。用户行为分析软件通过收集和分析来自各种来源的数据来分析和检测内部人员的可疑行为。这些来源包括网络日志和用户活动日志。通过检查这些数…...

内网渗透-跨域环境渗透-1

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击&#xff08;PTH攻击&#xff09; 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录&#xff0c;可以使用这个工具 ​ 第一种连接方式&#xff1a;smbclient -L 目…...

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…...

【java数据结构】HashMap和HashSet

目录 一.认识哈希表&#xff1a; 1.1什么是哈希表&#xff1f; 1.2哈希表的表示&#xff1a; 1.3常见哈希函数&#xff1a; 二.认识HashMap和HashSet: 2.1关于Map.Entry的说明:,> 2.2Map常用方法说明&#xff1a; 2.3HashMap的使用案例&#xff1a; 2.4Set常见方法…...

基于Springboot的高校汉服租赁网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校汉服租赁网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…...

分布式解决方案

目录 1. 分布式ID1-1. 传统方案1-2. 分布式ID特点1-3. 实现方案1-4. 开源组件 2. 分布式Session2-1. 传统Session2-2. Spring-Session2-3. Token Redis2-4. JWT2-5. 拦截器统一处理Token2-6. Oauth2 3. 分布式锁3-1. redis3-2. Zookeeper 1. 分布式ID 1-1. 传统方案 时间戳U…...

力扣刷题日记——L724. 寻找数组的中心下标

1. 前言 今天是力扣刷题日记的第二天&#xff0c;今天依旧是一道简单题啊&#xff0c;慢慢来&#xff0c;先看看题目是什么吧。 2. 题目描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和…...

【Kotlin】类和对象

1 前言 Kotlin 是面向对象编程语言&#xff0c;与 Java 语言类似&#xff0c;都有类、对象、属性、构造函数、成员函数&#xff0c;都有封装、继承、多态三大特性&#xff0c;不同点如下。 Java 有静态&#xff08;static&#xff09;代码块&#xff0c;Kotlin 没有&#xff1…...

Docker完整版(一)

Docker完整版&#xff08;一&#xff09; 一、Docker概述1.1、Docker简介1.2、Docker的用途1.3、容器与虚拟机的区别1.4、Docker系统架构1.5、Docker仓库 二、Docker引擎2.1、Docker引擎架构2.2、Docker引擎分类2.3、Docker引擎的安装2.4、Docker镜像加速器 三、Docker镜像3.1、…...

AIOPS:Zabbix结合讯飞星火做自动化告警+邮件通知并基于人工智能提供解决方案

目前Zabbix官方已经提供Zabbix+ChatGPT的解决方案 ChatGPT一周年,你充分利用了吗?Zabbix+ChatGPT,轻松化解告警! 但是由于需要魔法等其他因素,比较不稳定,遂决定使用国内模型,这里我挑选的是讯飞星火,基于我之前的文档,在此基础上通过Zabbix的告警脚本实现调用AI模型…...

AHU 汇编 实验六

一、实验名称&#xff1a;实验6 输入一个16进制数&#xff0c;把它转换为10进制数输出 实验目的&#xff1a; 培养汇编中设计子程序的能力 实验过程&#xff1a; 源代码&#xff1a; data segmentbuff1 db Please input a number(H):$buff2 db 30,?,30 dup(?),13,10buff3 …...

Linux的输出、输入重定向和管道

目录 输出重定向 输入重定向 < << 管道操作 输出重定向 当我输⼊⼀个命令之后&#xff0c;回⻋&#xff0c;命令产⽣了结果&#xff0c;结果默认是输出到屏幕上的。 默认情况&#xff0c;⽆论⼀个命令执⾏正确与否&#xff0c;结果都会默认输出到屏幕上。 在有…...

java-新手笔记(枚举)

枚举&#xff08;Enumeration&#xff09;是一种特殊的类&#xff0c;用于表示固定数量的常量值。 枚举类型使得代码更加清晰&#xff0c;易于维护&#xff0c;同时也增加了类型安全。 这边使用一个枚举封装重要数据 enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FR…...

Centos7 安装postgresql14后无法连接数据库

1、数据库服务器允许外部访问5432端口。 2、postgresql.conf 3、pg_hba.conf a、制定某个IP&#xff08;192.168.0.107&#xff09;访问 b、指定ip段访问 允许10.1.1.0~10.1.1.255网段登录数据库 host all all 10.1.1.0/24 trust c、指定全网访问 host a…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...