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

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.hqwc.cn/news/523017.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 ucore lab3 无法触发 page fault 的问题

问题描述 完成清华大学操作系统实验课 ucore(x86) lab3 时&#xff0c;发现无法触发 page fault 异常&#xff0c;具体来说时 check_pgfault() 函数会在执行如下代码时报错 static void check_pgfault(void) {// ......uintptr_t addr 0x100;assert(find_vma(mm, addr) vma…

阿里云服务器“地域”怎么选择?2024新版教程

阿里云服务器地域选择方法&#xff0c;如何选择速度更快、网络延迟更低的地域节点&#xff0c;地域指云服务器所在的地理位置区域&#xff0c;地域以城市划分&#xff0c;如北京、杭州、深圳及上海等&#xff0c;如何选择地域&#xff1f;建议根据用户所在地区就近选择地域&…

蓝桥杯2017年第八届真题-分巧克力

目录 题目描述 输入格式 输出格式 样例输入 样例输出 原题链接 代码实现 题目描述 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见&#xff0c;小明需…

【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…

git fatal: detected dubious ownership in repository at ‘xxx‘ 彻底解决方法

前言 在 windows 重置后&#xff0c; git 仓库无法正常使用 git 的所有 命令&#xff0c;运行任何 git 命令&#xff0c;都会提示如下&#xff1a; $ git log fatal: detected dubious ownership in repository at D:/rk/rk3568/nanopi/uboot-rockchip D:/rk/rk3568/nanopi/u…

SpringBoot学习之自定义注解和AOP 切面统一保存操作日志(二十九)

一、定义一个注解 这个注解是用来控制是否需要保存操作日志的自定义注解(这个类似标记或者开关) package com.xu.demo.common.anotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; i…

FTP服务器中文环境引起润日下载不了附件问题解析

FTP服务器中文环境引起润日下载不了附件问题解析 一、问题背景&#xff1a; 20240229日某农商行因为FTP下载功能有问题&#xff0c;导致当天所有涉及FTP文件下载的交易都不能正常使用&#xff0c;对于银行来说影响还是比较大。现将当天出问题的原因及处理过程解析如下&#x…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动&#xff0c;使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”&#xff0c;查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

优先完善功能测试,再考虑其他事项

软件测试是对项目研发过程产物&#xff08;文档、代码、程序等&#xff09;进行审查&#xff0c;保障产品质量的过程。 测试人员应具备从用户角度、开发角度和业务角度审查研发过程产物的能力&#xff0c;从而促使最终的产品达到用户、开发和业务三方要求。 测试人员的价值是…

(C语言)字符分类函数

目录 字符分类函数 1. iscntrl 2. isspace 3. isdigit 4. isxdigit 5. islower 6. isupper 7. isalpha 8. isalnum 9. ispunct 10. isgraph 11. isprint 字符分类函数 C语言中有一系列的函数是专门做字符分类的 &#xff0c;也就是一个字符是属于什么类型的字符的。…

安泰ATG-3090功率信号源的输出信号是什么意思

功率信号源是指能够提供电能输出的设备&#xff0c;其输出信号通常以功率的形式存在。功率信号源在各种应用中发挥着重要作用&#xff0c;涵盖了广泛的领域&#xff0c;包括电力系统、通信、电子设备等。以下是关于功率信号源输出信号的详细介绍。 功率信号源是一种能够将输入能…

操作系统:进程优先级

目录 1.进程优先级 1.1.基本概念 1.2.其他概念 1.3.进程切换 2.解读Linux2.6内核进程的调度队列 1.进程优先级 1.1.基本概念 我们在日常生活中的经验&#xff0c;排队的本质就是确认优先级&#xff0c;排队的原因就是资源不足&#xff0c;需要进行分配。那么在内存资源有…