【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结构体中拉黑了信号2
	
	sigemptyset(&(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云服务器2核4G配置,阿里云和腾讯云哪个便宜?性能更好?

租用2核4G服务器费用多少&#xff1f;2核4G云服务器多少钱一年&#xff1f;1个月费用多少&#xff1f;阿里云2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年&#xff1b;腾讯云轻量2核4G服务器5M带宽165元一年、252元15个月、540元三…

【Stable Diffusion】入门:原理简介+应用安装(Windows)+生成步骤

【Stable Diffusion】入门&#xff1a;原理简介应用安装&#xff08;Windows&#xff09;生成步骤 原理简介应用安装 原理简介 稳定扩散生成模型(Stable Diffusion)是一种潜在的文本到图像扩散模型&#xff0c;能够在给定任何文本输入的情况下生成照片般逼真的图像。 应用安…

蓝桥杯2019年第十届省赛真题-修改数组

查重类题目&#xff0c;想到用标记数组记录是否出现过 但是最坏情况下可能会从头找到小尾巴&#xff0c;时间复杂度O(n2)&#xff0c;数据范围106显然超时 再细看下题目&#xff0c;我们重复进行了寻找是否出现过&#xff0c;干脆把每个元素出现过的次数k记录下来&#xff0c;直…

C++:2024/3/11

作业1&#xff1a;编程 要求&#xff1a;提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 代码&#xff1a; #include <iostream>using namespace std;int main() {//定义一个字符串string str;//提示输入字符串…

【计算机网络】1.5 分组交换网中的时延、丢包和吞吐量

A.分组交换网中的时延 当分组从一个节点沿着路径到后一节点时&#xff0c;该分组在沿途的各个节点经受了几种不同类型的时延。 时延的类型 处理时延 - d n o d a l d_{nodal} dnodal​ 处理时延包括以下部分—— a. 检查分组首部 b. 决定分组导向 排队时延 - d p r o c d_{…

华为OD机试 - 垃圾信息拦截(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

选择短信群发平台要小心陷阱

你知道短信群发平台也有陷阱吗&#xff1f;选择短信群发平台很重要&#xff0c;今天小编就为您介绍短信群发平台有哪些陷阱&#xff1f; 这几点你要注意了&#xff1a; 1、扣量&#xff0c;有些不靠谱的短信群发平台开始以低价诱惑“客户”&#xff0c;但是发送过程中就暗中扣…

【前端寻宝之路】学习和使用CSS的所有选择器

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-blSAMs8NTfBKaPl8 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

前端网页如何在 Windows 上测试 Safari

“Windows上的Safari&#xff1f;”&#xff0c;“那不可能&#xff01; Safari 无法在 Windows 上运行。当然的&#xff01; 曾经可以在windows上运行&#xff0c;但苹果早在 2012 年就停止支持 Windows。对于想要测试 Safari 兼容性的 Web 开发人员来说&#xff0c;这真是太不…

ubuntu 23开机界面美化教程

效果 方法 GRUB开机界面美化 从上述网站中&#xff0c;查找GRUB Themes分类&#xff0c;并下载GRUB主题包&#xff08;tar.gz格式&#xff09;&#xff0c;如CyberSynchro.tar.gz&#xff1b; 解压下载得到的压缩包&#xff0c;得到CyberSynchro&#xff1b; 将CyberSynchro…

connection SQLException, url:jdbc ,errorCode 0, state 08S01

connection SQLException, url: jdbc:mysql://localhost:3306/itcast_health?useUnicodetrue&characterEncodingutf-8, errorCode 0, state 08S01 添加&#xff1a;&useSSLfalse 添加前 添加后&#xff1a; 查询数据库正常

2.1 关系数据结构及形式化定义 数据库概论

目录 2.1.1 关系 关系&#xff1a;概念 1. 域&#xff08;Domain&#xff09; 2.笛卡尔积 元组&#xff08;Tuple&#xff09; 分量&#xff08;Component&#xff09; 基数&#xff08;Cardinal number&#xff09; 3. 关系 候选码&#xff08;Candidate key&#xf…

解决 Webpack 中 ERROR in main Module not found: Error: Can‘t resolve ‘./src‘ 问题

出自 BV1MN411y7pw&#xff0c; P98 黑马AJAX-Node.js-Webpack教学视频中webpack部分&#xff0c;打包的时候出错 ERROR in main Module not found: Error: Cant resolve ./src in V:\Web\mycode\webpack\01_webpack_use resolve ./src in V:\Web\mycode\webpack\01_webpack_us…

【2024金三银四】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

ReorderData - 优化阅读笔记

主要实现文件: bolt/lib/Passes/ReorderData.cpp 支持 X86/Arm 测试用例&#xff1a; bolt/test/reorder-data-writable-ptload.c int a1,a2,a3,a4; // 待补充默认关闭&#xff0c;开启选项&#xff1a; # 指定要重排的数据段 --reorder-data<section1,section2,section3…

基于JavaWeb开发的springboot网咖管理系统[附源码]

基于JavaWeb开发的springboot网咖管理系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &a…

Android14音频进阶:生产者与消费者模型(六十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

力扣每日一题 将标题首字母大写 模拟 String API

Problem: 2129. 将标题首字母大写 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public String capitalizeTitle(String title)…

数据结构:栈的创建与使用

今天我们一起来看一种新的数据结构栈&#xff0c;其实这一种结构我们在之前就已经使用过&#xff0c;只是今天我们来强调以下几点&#xff1a; 1、栈是一种数据后进先出的结构 &#xff0c;通过入栈1 2 3 4我们可以得到多种结果 2、我们选用顺序表来实现栈结构&#xff0c;这里…