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号)被设计出来为了软硬件设计,如:磁盘探针寻址寻道,用在上一页或下一页等操作上

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

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

相关文章

MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷&#xff0c;等到把数据表的删除说完咱们统一&#xff0c;总结书写 1.数据表的删除&#xff1a; 语法&#xff1a; 1. 使用 DROP TABLE 语句删除单个表 基本语法&#xff1a;DROP TABLE [IF EXISTS] table_name; table_name是要删除的表的名称。IF EXIS…

国内首位聋人 Android 软件工程师体验通义灵码,“这真是太棒了”

Hi 大家好&#xff01; 我就是人见人爱、Bug 闪开的通义灵码&#xff01; 上个月&#xff0c;我上线了一项新能力&#xff1a; 体验通义灵码 workspace&#xff1a;轻松分析项目结构&#xff0c;结合代码仓库理解工程、查询问答等 补充说明&#xff1a;当你需要快速了解一个工…

萌熊数据科技:剑指脑机转入,开启科技新篇章

近日&#xff0c;科技圈传来一则令人瞩目的消息&#xff0c;天津萌熊数据科技有限公司和天津一万年科技发展有限公司在全国范围内大力开展AI加生命科学的主体业务&#xff0c;并明确将朝着脑机转入方向深入发展&#xff0c;引发了行业内外的广泛关注。 天津萌熊数据科技有限公司…

OceanBase 安装使用详细说明

OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…

MYSQL---TEST5(Trigger触发器Procedure存储过程综合练习)

触发器Trigger 数据库mydb16_trigger创建 表的创建 goods create table goods( gid char(8) primary key, #商品号 name varchar(10), #商品名 price decimal(8,2), #价格 num int&#xff1b;&#xff09; #数量orders create tabl…

MySQL 完整教程:从入门到精通

MySQL 完整教程&#xff1a;从入门到精通 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;它使用结构化查询语言 (SQL) 来管理和操作数据。本文将详细介绍 MySQL 的基本概念、安装与配置、常用 SQL 语法、数据表的创建与管理、索引、视图、存储过程、触发器等高级特性…

winfrom控制应用程式不能双开

功能&#xff1a;控制winform应用程式不能双开 //应用程式不能双开bool isAppRunning false;Mutex mutex new Mutex(true, "MyApp", out isAppRunning);if (!isAppRunning){MessageBox.Show("程序已运行&#xff0c;不能再次打开&#xff01;");Environm…

uniapp:启动界面关闭时长控制

代码控制关闭启动界面 App启动后不会自动关闭启动界面&#xff0c;需要在代码中调用plus.navigator.closeSplashscreen关闭启动界面。"app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"autoclose" : false,}, }很多…

从数据提取到管理:TextIn平台的全面解析与产品体验

一、引言 在现代信息时代&#xff0c;文档解析和管理已经成为企业和开发者不可或缺的工具。TextIn是合合信息旗下的一款智能文档处理平台&#xff0c;为开发者和企业提供高效、精准的文档解析工具&#xff0c;帮助用户轻松应对各种复杂的文档处理需求。本文将深入探讨TextIn的…

Spring Boot技术在校园社团管理中的高效应用

3系统分析 3.1可行性分析 通过对本校园社团信息管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本校园社团信息管理系统采用SSM框架&#xff0c;JAVA作…

软件工程(软考高频)

一、软件工程概述 1.软件的基本生命周期 2.软件过程 二、软件开发方法 三、 软件开发模型 1.瀑布模型和V模型 2.原型模型和螺旋模型 3. 增量模型 4.喷泉模型 5.统一过程UP模型 6.敏捷方法 敏捷方法的开发模型 四、需求分析 1.基本概念 2.需求的分类 3.需求分析的工具 (1)数…

Spring整合Mybatis过程

配置文件 springConfig --> [jdbcConfig mybatisConfig] jdbc配置文件进行基本的数据库连接池配置 mybatis配置文件进行SqlSessionFactory Bean 和 MapperScannerConfigurer Bean的创建 在Spring容器启动时&#xff0c;系统会根据配置创建并初始化所有MyBatis所需的Bean…

ML2001-1 机器学习/深度学习 Introduction of Machine / Deep Learning

图片说明来自李宏毅老师视频的学习笔记&#xff0c;如有侵权&#xff0c;请通知下架 影片参考 【李宏毅】3.第一节 - (上) - 机器学习基本概念简介_哔哩哔哩_bilibili 1. 机器学习的概念与任务类型 概念&#xff1a;机器学习近似于寻找函数&#xff0c;用于处理不同类型的任…

【Java多线程】:理解线程创建、特性及后台进程

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 一、背景 -- 进程与线程&#x1f680; &#x1f525; 多线程是提升程序性能非常…

Matlab实现海马优化算法(SHO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 海马优化算法&#xff08;SHO&#xff09;是一种受自然界海马行为启发的优化算法&#xff0c;它通过模拟海马在寻找食物和配偶时的探索、跟踪和聚集行为来搜索最优解。SHO因其高效的全局搜索能力和局部搜索能力而…

【初阶数据结构与算法】复杂度分析练习之轮转数组(多种方法)

文章目录 复杂度练习之轮转数组方法1方法2方法3 总结 复杂度练习之轮转数组 题目链接&#xff1a;https://leetcode.cn/problems/rotate-array/description/    为什么我们把这道题作为复杂度的练习题呢&#xff1f;是因为我们以后做题都会涉及到复杂度的计算&#xff0c;我…

哲学家就餐问题(Java实现信号量和PV操作)

哲学家就餐是经典的PV操作。 一个哲学家同时拿起左边的筷子和右边的筷子进行就餐&#xff0c;每一个哲学家都会等待右边的筷子&#xff0c;具备了死锁问题之一的循环等待。 基础的哲学家就餐问题代码 在Java中&#xff0c;Semaphore 是一个用于控制对某个资源的访问的同步工具…

mutable用法

mutable 关键字用于允许类的某个成员变量在 const 成员函数中被修改。通常&#xff0c;const 成员函数不能改变对象的任何成员变量&#xff0c;但将成员变量声明为 mutable 可以例外 class Hero { public:Hero():m_Hp(0), m_getHpCounter(0){}int getHp() const {m_getHpCounte…

C++ | Leetcode C++题解之第537题复数乘法

题目&#xff1a; 题解&#xff1a; class Solution { public:string complexNumberMultiply(string num1, string num2) {regex re("\\|i"); vector<string> complex1(sregex_token_iterator(num1.begin(), num1.end(), re, -1), std::sregex_token_iterator…

告别传统营销,HubSpot AI分析工具带你玩转新潮流

你们知道吗&#xff1f;现在的人工智能&#xff08;AI&#xff09;技术可是越来越厉害了&#xff0c;它简直就是我们营销人员的超级外挂&#xff01;有了AI分析工具&#xff0c;我们不仅能优化营销效果&#xff0c;还能大大提升工作效率。那么&#xff0c;具体是怎么一回事呢&a…