Linux高阶——1103——Signal信号机制

1、信号机制

在linux和unix系统下,如果想要处置(挂起,结束)进程,可以使用信号,经典消息机制,所以进程包括系统进程都是利用信号处置进程的

kill -l——查看所有系统支持的信号

1-31号信号——Unix经典信号,是软件研发工程师需要了解的信号

32-33号信号——被系统隐藏,归NPTL线程库使用,不开放

34-64号信号——自定义信号,驱动研发了解

2、触发信号的5种方式

ps aux——查看进程信息

1、终端组合按键触发信号

ctl+c——发2号信号SIGINT

ctl+\——发3号信号SIGQUIT

ctl+z——发20号信号SIGTSTP

唤醒——fg 进程号

2、命令触发信号

kill -signo pid——可以向任意进程发出任意信号

3、函数触发信号

#include<signal.h>

kill(pid_t pid,int signo);——向任意进程发送任意信号

raise(int signo);——向调用进程发送任意信号

abort(void)——向调用进程发送SIG_ABRT信号

./mykill 9 1000

mykill代码

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>int main(int argc,char**argv)
{if(argc<3){   printf("mykill failed:pram error\n");exit(0);}   kill(atoi(argv[2]),atoi(argv[1]));return 0;
}

4、硬件异常系统触发信号

当进程执行时,如果违规访问硬件,系统会发送对应的信号,杀死进程,避免访问

1、当进程中出现进程访问权限异常,例如只读内存写操作,产生段错误(内存核心已转储),系统发送SIGSEGV(11号)信号杀死目标进程

2、进程访问内存越界,触发总线错误(内存核心已转储),系统发送SIGBUS(7号)信号,杀死目标进程

3、进程使用cpu,计数异常,系统抛出浮点数例外(核心已转储),系统发送SIGFPE(8号)信号,杀死目标进程

5、软条件触发信号

在使用某个功能或设备时,当使用满足了软条件,系统会发送信号杀死进程

eg:

1、alarm定时器

用户可以自定义定时的时长,当定时的时间达到,系统会发送SIGALRM(14号)信号,但是信号会杀死进程

alarm定时器

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>int main()
{int count=0;alarm(1);while(1){   printf("++count %d\n",++count);}   return 0;
}

2、管道

管道读端关闭,写端向管道写数据,触发软条件,系统向写端发送SIGPIPE(13号)杀死进程

3、信号的行为或动作

系统中提供的信号一般都是用来杀死或挂起进程,信号的行为一般是被提前预设好的,但是可以修改,用户可以自定义变更行为和动作

SIGNAL一般有三种行为

1、SIG_DFL(默认行为:杀死目标)

是信号首选的默认行为

默认处理动作一般分为5种:

TERM——杀死进程

CORE——杀死进程并转储核心

IGN——不干预进程

STOP——挂起进程

COUNT——唤醒进程

2、SIG_IGN(忽略行为:放弃)

处理动作:NULL

3、SIG_ACTION(捕捉行为:自定义)

处理动作:自定义动作

捕捉函数

void sig_do(int n)
{printf("gfytguhbjgv"\n);
}

捕捉函数需要开发者自行定义与实现,但是只有信号触发抵达进程,系统自动调用

行为1中的忽略动作与行为2的忽略行为相比,结果一致,但是优先级不同,行为的优先级比动作高

每个信号拥有自己的信号行为结构体,struct sigaction,自己定义修改结构体,对进程原有的结构体进行替换,因为所有默认信号行为结构体中的行为都是默认的

处理行为设定

act.sa_handler=SIG_DFL/SIG_IGN/捕捉函数地址

默认选项

act.sa_flags=0;

临时屏蔽字,可以使用sigemptyset初始化

act.sa_mask;

结构体

struct sigaction act,oact;
void (*sa_handler)(int)
{act.sa_handler=SIG_DFL/SIG_IGN/捕捉函数地址act.sa_flags=0;act.sa_mask;
}

4、改变信号行为的方法

用自定义结构体替换原有的结构体

第一个参数是要修改的信号

第二个参数是新的结构体

第三个参数是原有的结构体

sigaction(SIGINT,&act,&oact);

替换修改信号行为结构体,一般情况下要传出进程原有的结构体,便于复位

虽然SIGINT代表的是2号信号,但是不能只传入2,因为不同电脑的信号名和编号不一定相同

eg:改变信号行为

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>void sig_do(int n)
{int flags=3;while(flags--){   printf("         flag %d running...\n",flags);sleep(1);}   
}int main()
{struct sigaction act,oact;act.sa_handler=sig_do;act.sa_flags=0;sigemptyset(&act.sa_mask);sigaction(SIGINT,&act,&oact);while(1)sleep(1);
}

改变后不能使用ctrl+c杀死程序

5、信号的传递与处理流程

1、信号由系统发出,传递到PCB

2、PCB中有一个位图,为64位,每一位对应一个信号,称为未决信号集

还有一个位图,为64位,每一位对应一个信号,称为屏蔽字

3、信号从系统发出后,还未到达未决信号集前称为待传递信号

信号能否通过未决信号集取决于未决信号集中的位码,1为不允许,0为允许

如果信号不被允许通过未决信号集,则该信号会被直接丢弃,放弃处理

4、如果信号通过了未决信号集,但还未抵达屏蔽字集,称为未决态信号,都是待处理信号

如果信号通过了未决信号集,系统会将对应的未决信号集的位码置1,如果有相同信号再次被传递过来,会被直接丢弃,因为系统拒绝相同的信号同时传递,未决信号集的变化是系统进程设置的

5、如果信号通过了屏蔽字集,称为递达态信号

当信号变为递达态后,未决信号集的位码会被归0

系统初始是避免相同信号递达的,因为会产生捕捉函数调用冲突,因此如果某个信号递达,系统会设置临时屏蔽,将对应的屏蔽字位置设置为1,当递达信号处理完毕后,再解除屏蔽

当信号变为递达态信号,则信号正在处理,进程将被处置,杀死或者挂起(见上面3)

6、信号阻塞

指的是信号通过了未决信号集,但是未通过屏蔽字

屏蔽字是开发者可以自行设置的,用于屏蔽阻塞某些特定信号

7、如果同时发多个信号,则系统只能处理前两个发过来的信号,其余的会被全部丢弃

因为屏蔽字会被临时置1,递达态信号处理完毕后,才会归0

8、Unix经典信号,不支持排队,但是可以多阻塞1个

9、自定义信号(34-64号)支持排队

因为经典信号(1-31号)的设计初衷是处置进程

自定义信号(34-64号)被设计出来为了软硬件设计,如:磁盘探针寻址寻道,用在上一页或下一页等操作上

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

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

相关文章

修改HarmonyOS鸿蒙图标和名字,打包后安装到真机,应用图标丢失变成透明,修改名字也不生效,还是默认的labeL解决方案教程

HarmonyOS鸿蒙打包hap 安装应用到桌面没有图标&#xff0c;用hdc安装到真机&#xff0c;打包后应用图标丢失变成透明&#xff0c;名字也还是默认的label的bug&#xff0c;以下是解决方案 以下是修改方案&#xff1a; 1、修改应用名字&#xff1a; 2、修改应用图标&#xff1a…

Python小游戏20——超级玛丽

首先&#xff0c;你需要确保你的Python环境中安装了pygame库。如果还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …

CTF-WEB: python模板注入

漏洞是如何产生的&#xff1f; Python模板注入漏洞通常出现在使用模板引擎生成动态内容的应用中。如果用户输入没有经过适当的处理直接插入模板中&#xff0c;就可能会导致模板注入漏洞。一个常见的例子是使用Jinja2模板引擎时&#xff0c;如果直接渲染用户输入&#xff0c;则…

从富文本窥探苹果的代码秘密

从富文本窥探苹果的代码秘密 背景 在我们的业务场景下&#xff0c;为突出诸如 “利益点”和“利率” 等特性以推动订单成交&#xff0c;引入了 “富文本” 这一概念。富文本具备丰富格式的文本展示与编辑功能。然而&#xff0c;恰是由于富文本具有 “多样式”“复杂排版” 等特…

spark集群模式-standalone的配置和使用

其中所需要的python和spark的软件在该文章中 spark-本地模式的配置和简单使用-CSDN博客 环境配置 首先在别的服务器上均要进行python环境的配置 安装spark 1、上传&#xff0c;解压&#xff0c;重命名 tar -zxvf /opt/install/spark-3.1.2-bin-hadoop3.2.tgz -C /opt/modu…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

AVLTree

1.AVL树的概念 二叉搜索树虽然可以提高查找的效率&#xff0c;但是如果数据有序或者接近有序&#xff0c;二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。为了解决该问题&#xff0c;于是就有了AVLTree。即当向二叉搜索树中插入…

使用 async/await 时未捕获异常的问题及解决方案

使用 async/await 时未捕获异常的问题及解决方案 1. 引言 在现代 JavaScript 开发中&#xff0c;async/await 是处理异步操作的强大工具&#xff0c;它使得异步代码看起来更像同步代码&#xff0c;提升了代码的可读性和可维护性。然而&#xff0c;在使用 async/await 时&…

【数据结构二叉树】C非递归算法实现二叉树的先序、中序、后序遍历

引言: 遍历二叉树&#xff1a;指按某条搜索路径巡访二叉树中每个结点&#xff0c;使得每个结点均被访问一次&#xff0c;而且仅被访问一次。 除了层次遍历外&#xff0c;二叉树有三个重要的遍历方法&#xff1a;先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…

深入学习 Scrapy 框架:从入门到精通的全面指南

深入学习 Scrapy 框架&#xff1a;从入门到精通的全面指南 引言 在数据驱动的时代&#xff0c;网络爬虫成为了获取信息的重要工具。Scrapy 是一个强大的 Python 爬虫框架&#xff0c;专为快速高效地提取网页数据而设计。本文将深入探讨 Scrapy 的使用&#xff0c;从基础知识到…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

图文深入介绍Oracle DB link(一)

1. 引言&#xff1a; 本文图文深入介绍Oracle DB link&#xff0c;先介绍基本概念。 2.DB link的定义 数据库链接&#xff08;Database Link&#xff0c;简称 DB Link&#xff09;是 Oracle 数据库中的一个重要功能。它是一种在一个 Oracle 数据库实例中访问另一个 Oracle 数…

MoonBit 双周报 Vol.59:新增编译器常量支持,改进未使用警告,支持跨包函数导入...多个关键技术持续优化中!

2024-11-04 MoonBit更新 增加了编译期常量的支持。常量的名字以大写字母开头&#xff0c;用语法 const C ... 声明。常量的类型必须是内建的数字类型或 String。常量可以当作普通的值使用&#xff0c;也可以用于模式匹配。常量的值目前只能是字面量&#xff1a; const MIN_…

HTB:Shocker[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on Shocker? 使用nmap对靶机TCP端口进行开放扫描 2.What is the name of the directory available on the webserver that is a standard name known for running scripts via the Common Gateway Int…

【算法赌场】SPFA算法

1.算法简介 SPFA 算法的全称是&#xff1a;Shortest Path Faster Algorithm&#xff0c;是西南交通大学 段凡丁 于 1994 年发表的论文中的名字。不过&#xff0c;段凡丁的证明是错误的&#xff0c;且在 Bellman-Ford 算法提出后不久&#xff08;1957 年&#xff09;已有队列优化…

YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)

一、本文介绍 本文记录的是利用CGNet中的CG block模块优化YOLOv11的目标检测网络模型。CG block通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到v11中,并进行二次创新,…

并发编程(6)——future、promise、async,线程池

六、day6 今天学习如何使用std::future、std::async、std::promise。主要内容包括&#xff1a; 参考&#xff1a; https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2Agk6II6SsiG8DwPawfXHsP4bUT https://github.com/Mq-b/ModernCpp-ConcurrentProgrammin…

力扣——另一个的子树(C语言)

1.题目&#xff1a; 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …

【C++】对左值引用右值引用的深入理解(右值引用与移动语义)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 ​ 目录 前言&#xff1a;对引用的底层理解 一、左值与右值 提问&#xff1a;左值在左&#xff0c;右值在右&#xff1f;…