【Linux基础(三)】信号

news2024/12/23 10:06:31

学习分享

  • 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、屏蔽信号示例

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;
}

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

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

相关文章

官网正在被哪些产品蚕食,定制网站又被哪些建站产品挤占。

2023-12-09 16:22贝格前端工场 官网建设是一个被大多数人看衰的市场&#xff0c;本文来理性分析下&#xff0c;谁在蚕食这个市场&#xff0c;谁又在挤占这个产品生存空间&#xff0c;欢迎大家评论&#xff0c;探讨。 网站正在被以下产品形式取代&#xff1a; 1. 移动应用&…

深入理解并发编程:解锁现代软件性能的关键

在当今快速发展的软件开发世界中&#xff0c;并发编程已经成为一种无法回避的重要议题。它涉及到如何在同一时间内处理多个任务&#xff0c;以此来提升应用程序的性能和响应速度。互联网服务的高并发需求以及多核处理器的普及使得并发编程成为了现代软件工程的一个核心组成部分…

09---蜂鸣器电路设计

视频链接 蜂鸣器硬件电路设计01_哔哩哔哩_bilibili 蜂鸣器电路设计 1、蜂鸣器的定义 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器…

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException&#xff08;空指针异常&#xff09;ArithmeticException&#xff08;数学运算异常&#xff09;ArrayIndexOutOfBoundsException&#xff08;数组下标越界异常&#xff09;ClassCastException&#xff08;类型转换…

CSS补充(下),弹性布局(上)

高级选择器 1.兄弟选择器 2.同时满足 div.bg{background-color: red;}p.bg{background-color: green;}spam.bg{background-color: blue;}注&#xff1a;选择器中间没有空格&#xff0c;有明确标识的选择器写在后面 3.各种伪类的应用 3.1作为第几个子元素 选择器:nth-child…

Windows的自动更新和自带的杀毒软件怎么弄掉!

关闭Windows系统更新 Windows系统更新是为了保持设备的平稳和安全运行,保持操作系统安全、稳定及获取新功能修复已知问题并修补安全漏洞的重要过程。如果您想要临时或永久关闭Windows系统的自动更新,可以采用以下几种方式。不过,请务必意识到,禁用系统更新可能会导致您的系…

Java多线程——如何保证原子性

目录 引出原子性保障原子性CAS 创建线程有几种方式&#xff1f;方式1&#xff1a;继承Thread创建线程方式2&#xff1a;通过Runnable方式3&#xff1a;通过Callable创建线程方式4&#xff1a;通过线程池概述ThreadPoolExecutor API代码实现源码分析工作原理&#xff1a;线程池的…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】&#xff08;底层operator【】函数&#xff09; ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

Xilinx 7系列 FPGA硬件知识系列(九)——FPGA的配置

1.3 端口配置 每组配置模式都有一组特定的接口管脚&#xff0c;它们跨越7系列FPGA上的一个或多个I/O BANK。7系列器件支持3.3V、2.5V、1.8V或1.5V的I/O配置&#xff0c;包括&#xff1a; BANK 0 中的JTAG管脚、BANK0中的专用配置管脚 BANK14和BANK15中与特定配置模式相关的管…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号半佛仙人近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

包含字母数字及特殊字符 三种组合的正则两种写法

//长度8~16位&#xff1b;包含字母、数字及特殊字符 #$%^&*_-//正则1 写法&#xff1a;let reg_1 /^(?![A-Za-z0-9]$)^(?![A-Za-z#$\%^&*_\-]$)^(?![0-9#$\%^&_*\-]$)([A-Za-z0-9#$\%^&*_\-]{8,16})$///正则2 写法&#xff1a;let reg_2 /^(?![A-Za-z#$%…

在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程

前言 在系统之家或者其他地方下载的镜像文件怎么装到电脑上&#xff1f; 首先要知道系统之家下载的Windows镜像文件基本上都是.iso结尾的&#xff0c;要进入到对应镜像包才能看出系统镜像是什么格式。 如何分辨镜像的格式 选择对应的.iso镜像&#xff0c;点击【鼠标右键】-【装…

力扣大厂热门面试算法题 9-11

9. 回文数&#xff0c;10. 正则表达式匹配&#xff0c;11. 盛最多水的容器&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.08 可通过leetcode所有测试用例。 目录 9. 回文数 解题思路 完整代码 Java Python 10. 正则表达式…

3dmax渲染出来是黑色的怎么办?

灯光问题&#xff1a;渲染场景中的灯光可能全部关闭&#xff0c;包括默认灯光&#xff0c;或者手动添加的灯光没有开启全局光照&#xff08;GI&#xff09;。解决方法是检查并开启场景中的灯光&#xff0c;确保全局光照已开启。 摄像机问题&#xff1a;摄像机可能被黑色对象挡…

golang 注释插件

Goanno插件 自动生成golang注释,该插件为 Intellij/Goland 中的 golang 提供自动生成注释 如何使用&#xff1f; control command / (for windows: control alt /)&#xff08;生成注释&#xff09;Right click -> Generate -> Goanno&#xff08;生成注释&#x…

系统架构设计师 2023年 案例分析

一、大数据架构 Lambda架构和Kappa架构 某网作为某电视台在互联网上的大型门户入口,某一年成为某奥运会中国大陆地区的特权转播商,独家全程直播了某奥运会全部的赛事,积累了庞大稳定的用户群,这些用户在使用各类服务过程中产生了大量数据,对这些海量数据进行分析与挖掘,将…

重学SpringBoot3-WebMvcAutoConfiguration类

重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义MVC配置4. 消息转换器5. 异常处理 是什么 org.springframework.boot.autoconfigure.web.servlet.WebMvcAut…

Linux mmap系统调用

文章目录 前言一、mmap()函数简介二、代码演示2.1 mmap使用场景2.2 私有匿名映射2.3 私有文件映射2.4 共享匿名映射2.5 共享文件映射 参考 前言 NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman.h>void *mmap(void *addr, siz…

AcWing 505. 火柴排队(每日一题)

目录 题目链接&#xff1a;505. 火柴排队 - AcWing题库 解题思路&#xff1a; 离散化&#xff1a; 归并排序求逆序对&#xff1a; 总代码&#xff1a; 题目链接&#xff1a;505. 火柴排队 - AcWing题库 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴&#xff0c;每根火柴…

牛客小白月赛88

E.多重映射 解题思路 对集合进行整体操作&#xff0c;集合大小只增不减&#xff0c;问最后集合标号维护集合&#xff0c;考虑并查集但直接用并差集维护会有以下问题&#xff1a;当前集合变标号&#xff0c;可能会和之前标号相同&#xff0c;则进行并查集操作时&#xff0c;会接…