当前位置: 首页 > news >正文

科林Linux_4 信号

#include <signal.h>

信号signal:Linux或Unix系统支持的经典的消息机制,用于处置进程,挂起进程或杀死进程

kill -l    #查看系统支持的信号

1~31 Unix经典信号(软件开发工程师)

32、33信号被系统隐藏,不对用户开放,供NPTL线程库使用

34~64 自定义信号/实时信号(驱动工程师)

Ctrl+C 系统帮你发送了 2)SIGINT信号。终端组合按键产生的信号,杀死唯一的前台终端进程。

一、系统中触发信号的几种方式:

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

Ctrl+C SIGINT/2 终止进程        Ctrl+\ SIGQUIT/3 退出进程        Ctrl+Z SIGTSTP/20 挂起终端进程

jobs    #查看挂起的作业编号
fg 作业编号    #唤醒到前台

tty 终端 pts 虚拟终端

               D (TASK_UNINTERRUPTIBLE)     不可中断的睡眠状态
               R (TASK_RUNNING)                正在运行,或在队列中的进程
               S (TASK_INTERRUPTIBLE)        可中断的睡眠状态
               T (TASK_STOPPED)                停止状态
               t (TASK_TRACED)                被跟踪状态
               Z (TASK_DEAD - EXIT_ZOMBIE)  退出状态,但没被父进程收尸,成为僵尸状态
               W                            进入内存交换(从内核2.6开始无效)
               X (TASK_DEAD - EXIT_DEAD)    退出状态,进程即将被销毁


               <    高优先级
               N    低优先级
               L    有些页被锁进内存
               s    包含子进程
               +    位于前台的进程组;
               l    多线程,克隆线程  multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

 2、命令触发信号

kill -signo信号 pid进程号    #向任意进程发送任意信号

3、函数触发信号

kill(pid_t pid,int signo);    //向任意进程发送任意信号
raise(int signo);    //向当前进程发送任意信号
abort();    //向当前进程发送固定的SIGABRT/6信号
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>int main(int argc,char* argv[]){//支持命令,KILL signo pidif(argc<3){printf("pram error\n");exit(0);}kill(atoi(argv[2]),atoi(argv[1]));return 0;
}

4、硬件异常产生信号

违规访问使用硬件,导致信号杀死进程

1)如果进程非法操作内存,系统向其发送SIGSEGV/11杀死进程,错误信号为段错误

    char* str="hello";str[0]='H';    //只读内存的写操作

 2)如果进程出现cpu运算异常,系统向其发送SIGFPE/8杀死进程,错误为浮点数例外

    int b=0;    int a=8/b;    //除0

3)如果进程出现内存访问越界,系统向其发送SIGBUS/7杀死进程,错误为总线错误

    int* ptr=NULL;int fd=open("MapFile",O_RDWR);int size=lseek(fd,0,SEEK_END);ptr=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);    //在使用mmap内存映射时,若"MapFile"是内容为空的新文件大小为0,没有与之对应的合法的物理页,mmap不能扩展,发生了越界访问//添加错误检测来防止总线错误if((ptr=mmap(NULL,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==MAP_FAILED){//内存映射perror("mmap failed");exit(0);}

5、软件异常产生信号

可以使用某个组件,但是如果使用时触发软条件,系统会杀死进程(信号)

1)定时器alarm(10),定时到时,系统向定时进程发送SIGALRM/14信号,默认杀死进程

    alarm(1);    //定时1s后杀死进程,返回“闹钟”

2)匿名管道读端关闭,写端向管道写数据,系统向写端发送SIGPIPE/13信号,杀死进程

二、信号的三大行为与处理动作:

信号的行为可以被修改,默认情况下为默认行为,但是可以改为忽略或捕捉(三选一)

1、默认行为SIG_DFL:默认五种处理动作(五选一)

(1)TERM 直接杀死进程(2)CORE 杀死进程并且转储核心(3)STOP 挂起进程(4)CONT 忽略/继续进程(5)IGN 忽略

每个信号都有自己的默认动作来处置进程,进程不是被挂起就是被杀死。只有动作为IGN的信号,不会处置进程。

可以通过信号结束进程的输出,分析其动作

2、忽略行为SIG_IGN:忽略行为没有处理动作,无法处置进程

3、捕捉行为SIG_ACTION:可以手写捕捉函数来自定义行为

void sig_do(int n);

信号捕捉可以让自定义的捕捉函数与信号绑定,以后触发此信号,系统就会去执行此函数 

可以用来设计实现条件触发的工作和任务,信号触发则执行,否则不执行。

修改信号行为

每个信号都有一个自己的信号行为结构体,修改信号行为要保留其原结构体,便于复位

    struct sigaction nact,oact;    //信号行为结构体act.sa_handler=SIG_DFL|SIG_IGN|函数指针;act.sa_flags=0;    //默认选项act.sa_mask;    //临时屏蔽字sigaciton(signo,&nact,&oact);    //替换信号行为结构体,act为新的,oact传出进程原有的
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>void sig_do(int n){printf("已经成功捕捉SIGINT,signo=%d\n",n);
}int main(){//void(*sa_handle)(int)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);return 0;
}

三、三种让信号生效的方法:

1、信号忽略,将信号设置为忽略行为

2、信号捕捉,对信号进行捕捉设定,绑定捕捉函数

3、信号屏蔽:阻塞信号的传递

如果信号通过未决信号集,系统会将未决中对应的位设置为1,标记未决同时避免相同的信号同时处理。

如果未决为1,对应的信号直接丢弃,不处理

信号的处理不支持排队(经典信号不支持排队队列,但是自定义信号可以),最大处理1个

驱动开发软件需要支持排队,因为每个信号与功能绑定,功能需要排队处理。经典信号目的是为了杀死进程,处理一次即可,无需排队。

信号通过屏蔽字,从未决态切换为递达态,系统将未决的1设置回0。系统会对正在处理的信号的屏蔽字临时设为1,等待信号处理完将屏蔽字设回0(避免如果捕捉函数中使用全局资源,信号多次执行出现异常)相同信号同时触发,最大可以处理两个,一个正在处理,一个被屏蔽,其他被丢弃。

如果将某个信号对应的屏蔽字位设置为1,该信号被阻塞,不允许递达。

用户可以自行设置信号屏蔽字,实现阻塞信号的效果。

屏蔽方式与忽略与捕捉有很大的不同。忽略与捕捉吸纳后已经递达了并处理完成了,但是屏蔽属于延迟处理,信号没有消失。

信号屏蔽设置:

    sigset_t set;    //信号集类型sigemptyset(&set);    //初始化0sigfillset(&set);    //初始化1sigaddset(&set,signo);    //将某个特定信号位置设置为1sigdelset(&set,signo);    //将某个信号位设置0int sigismember(&set,signo);    //返回特定信号位的位码sigprocmask(SIG_SETMASK,&newset,&oldset);    //设置替换进程的信号屏蔽字
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>int main(){sigset_t set,oset;sigemptyset(&set);sigaddset(&set,SIGQUIT);sigprocmask(SIG_SETMASK,&set,&oset);while(1)sleep(1);return 0;
}

四、高级信号与普通信号

高级信号:只要发出必然递达,无法屏蔽捕捉忽略

SIGKILL/9 必然杀死

SIGSTOP/19 必然挂起

硬件异常的信号SIGSEGV SIGFPE SIGBUS,用户发出触发可以屏蔽,但是系统触发不可屏蔽

查看当前进程实时的信号情况,应该查看未决信号集

    sigpending(&pset);    //调用此函数,系统会传出当前进程的未决信号集
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>int main(){sigset_t set,oset,pset;sigemptyset(&set);sigaddset(&set,SIGINT);//2sigaddset(&set,SIGQUIT);//3sigaddset(&set,SIGSEGV);//11sigaddset(&set,SIGALRM);//14sigprocmask(SIG_SETMASK,&set,&oset);while(1){sigpending(&pset);//传出进程未决for(int signo=1;signo<32;signo++)printf("%d",sigismember(&pset,signo));printf("\n");sleep(1);}return 0;
}

信号的处理不是实时的

系统发出的信号在内核层,而程序运行在用户层

1.进程执行于用户层,串行执行主函数代码

2.信号发送到内核层,等待处理

3.满足切换条件,切换到内核层

触发上下文切换(cpu权限切换)的三种事件:系统调用、软件中断(时间片完)、异常

4.完成调用、处置中断、处置异常

5.在返回用户层前,检查是否有未递达信号,如果有则处理

6.发现捕获函数在用户层使用,系统使用指令直接执行捕捉函数,避免切换(执行捕捉函数,系统并没有降低权限,避免了开销)

7.执行完毕通过SIG_RETURN指令返回内核层

8.执行上下文切换,返回用户空间

9.主函数从暂停的位置继续执行

一般情况下,主函数率先执行,但是执行过程中触发信号,系统调用捕捉函数,捕捉函数永远比主函数先执行完

主函数运行时使用当前进程的时间片,捕捉函数调用时主函数暂停使用当前进程的时间片(一个进程的时间片资源只有一份)

相关文章:

科林Linux_4 信号

#include <signal.h> 信号signal&#xff1a;Linux或Unix系统支持的经典的消息机制&#xff0c;用于处置进程&#xff0c;挂起进程或杀死进程 kill -l #查看系统支持的信号 1~31 Unix经典信号&#xff08;软件开发工程师&#xff09; 32、33信号被系统隐藏&#xf…...

C++:map和set类

关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身。那什么是关…...

[C/C++] -- 代理模式

代理模式是一种结构型设计模式&#xff0c;允许一个对象&#xff08;代理&#xff09;控制另一个对象的访问。代理对象通常充当客户端和实际目标对象之间的中间人&#xff0c;从而控制对目标对象的访问&#xff0c;可以在访问前后进行一些额外的处理。 代理模式的优点包括&…...

电商平台遭遇DDOS、CC攻击有什么防护方案

电商平台遭遇DDOS、CC攻击有什么防护方案&#xff1f;在数字化浪潮的推动下&#xff0c;电商平台已成为现代商业的重要组成部分&#xff0c;为消费者提供便捷、多样的购物体验。然而&#xff0c;随着业务的发展&#xff0c;电商平台也面临着日益严峻的网络安全挑战&#xff0c;…...

什么是 IIS

什么是 IIS 一、什么是 IIS二、IIS 的功能三、IIS 几点说明四、IIS 的版本五、IIS 常见的组合 欢迎关注【云边小网安】 一、什么是 IIS IIS&#xff1a;指 Internet Information Services &#xff0c;是一种由微软公司开发的 Web 服务器应用程序。IIS&#xff1a;是一种 Web …...

京东页面(黏性定位的实现)

前言: 本文章将分享一些我这周在制作京东页面的实现部分,页面表面大体和京东页面差不多,在里面加了一点script,但是很容易理解,希望大家看到可以有所收获,如果我有哪部分写的不太好,欢迎大家来跟我交流! &#x1f970;个人主页:心.c &#x1f973;文章专题:京东页面制作 &#…...

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第6章 安装Samba

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...

json-server 模拟接口服务

前端开发经常需要模拟接口请求&#xff0c;可以通过 json-server 实现。 1. 安装 json-server 在前端项目的终端命令行中执行 npm i json-server2. 创建数据源 在项目中新建文件 db.json &#xff0c;与 package.json 同级&#xff0c;内容为模拟的数据 注意 json 文件对格式…...

pycharm 将项目连同库一起打包及虚拟环境的使用

目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后&#xff0c;启动终端(Alt F12)&#xff0c;或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档&#xff0c;便于…...

GO语言核心30讲 实战与应用 (第三​部分)

原站地址&#xff1a;Go语言核心36讲_Golang_Go语言-极客时间 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 这些类型实现了 io 包的很多接口&#xff0c;目的是什么&#xff1f; 是为了提高不同程序实体之间的互操作性。 程序实体是指比如网…...

HttpServletRequest对象

1.作用 主要作用是用来接收客户端发送过来的请求信息&#xff0c;由servlet容器封装好传递给service()方法 2.常用方法 常用方法描述StringBuffer getRequestURL()获取客户端发送请求时的完整URLString getRequestURI()获取请求行中的资源名称部分&#xff08;项目名称开始&…...

Linux入门攻坚——23、DNS和BIND基础入门1

DNS——Domain Name Service&#xff0c;协议&#xff08;C/S&#xff0c;53/udp&#xff0c;53/tcp&#xff09; BIND——Berkeley Internet Name Domain&#xff0c;ISC&#xff08;www.isc.org&#xff09; 互联网络上主机之间的通信依靠的是IP&#xff0c;而人或程序一般使…...

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…...

Android Ant编译环境配置(Win)

1、 载ant包: 2、设置环境变量&#xff1a; 3、检查是否设置成功及版本 4、执行命令&#xff1a; android update project -p . -n “projectname”&#xff08;例如&#xff1a;android update project --target 1 -p . -n “Couplet”&#xff09;(只输入红色部分也是可以的…...

条件变量解决同步问题之打印金鱼

说明 本代码为jyy老师上课演示条件变量解决同步问题示例(本人只做记录与分享) 本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释 问题描述 有三类线程 T1 若干: 死循环打印< T2 若干: 死循环打印> T3 若干: 死循环打印_ 任务: 对线程同步&#xff0c;使得屏幕…...

10分钟了解Golang泛型

泛型是Golang在1.18版本引入的强大工具&#xff0c;能够帮助我们在合适的场合实现简洁、可读、可维护的代码。原文: Go Generics: Everything You Need To Know 导言 可能有人会觉得Go泛型很难&#xff0c;因此想要借鉴其他语言&#xff08;比如Java、NodeJS&#xff09;的泛型…...

鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口

系列篇从内核视角用一句话概括shell的底层实现为&#xff1a;两个任务&#xff0c;三个阶段。其本质是独立进程&#xff0c;因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry)&#xff1a; 负责接受来自终端(控制台)敲入的一个个字符&…...

TypeScript在前端项目的渐进式采用策略

渐进式采用 TypeScript 在前端项目中的策略通常包括: 引入TypeScript 如果我们有一个简单的JavaScript模块utils.js&#xff0c;它包含一个函数用于计算两数之和&#xff1a; // utils.js export function add(a, b) {return a b; }首先&#xff0c;我们将文件扩展名改为.t…...

C++容器常用集合(附传送门)

C常用的容器&#xff1a; string容器 C容器——string-CSDN博客 储存字符串的 vector容器 C容器——vector-CSDN博客 向量是动态数组&#xff0c;可以自动扩展以容纳更多元素。 插入和删除元素的时间复杂度取决于操作的位置 tuple容器&#xff08;元组&#xff09; C容器…...

基于springboot的校园资料分享平台源码数据库

基于springboot的校园资料分享平台源码数据库 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创…...

卷积神经网络(CNN)

大家好&#xff0c;这里是七七&#xff0c;今天来更新关于CNN相关的内容同了。本文是针对CNN原理的说明&#xff0c;但对于小白不是非常友好&#xff0c;建议先掌握神经网络相应知识再进行阅读哦。 一、卷积与互相关 卷积 卷积运算是对两个函数进行的一种数学运算&#xff0c…...

Linux入门攻坚——22、通信安全基础知识及openssl、CA证书

Linux系统常用的加解密工具&#xff1a;OpenSSL&#xff0c;gpg&#xff08;是pgp的实现&#xff09; 加密算法和协议&#xff1a; 对称加密&#xff1a;加解密使用同一个秘钥&#xff1b; DES&#xff1a;Data Encryption Standard&#xff0c;数据加密标准&…...

无障碍Web开发:遵循WCAG标准构建包容性用户体验

无障碍Web开发旨在确保所有用户&#xff0c;无论其身体条件或能力如何&#xff0c;都能轻松、有效地访问和使用Web内容。遵循Web Content Accessibility Guidelines (WCAG) 标准是实现这一目标的关键。以下是一些基于WCAG标准的无障碍Web开发实践&#xff0c;以构建更具包容性的…...

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如&#xff1a;v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…...

对象定义成final类型还能改变吗

如果一个Java对象被定义为final类型&#xff0c;那么它的引用不能被改变&#xff0c;但是对象本身的状态仍然可以被修改。这意味着你可以改变final对象的属性&#xff0c;但是不能将其引用指向另一个对象。 例如&#xff0c;下面的代码中&#xff0c;虽然person对象被声明为fi…...

Vue Router 路由hash和history模式

文章目录 hash和history模式区别Hash 模式History 模式 在 Vue 中&#xff0c;路由的两种主要模式是 hash 和 history&#xff0c;默认的路由模式是hash模式。。这两种模式决定了 URL 的外观以及浏览器如何处理 URL 的变化。 hash和history模式区别 特性Hash 模式History 模…...

【xrframe】优化ar相机中加载模型效果

方法一&#xff1a;定义渲染width和height //组件生命周期&#xff1a;在视图层布局完成后执行ready() {const info wx.getSystemInfoSync();//在小程序中同步获取系统信息const width info.windowWidth;//获取屏幕的宽度&#xff08;单位为物理像素&#xff09;const heigh…...

解决 SyntaxError: Unexpected token ‘.‘ 报错问题

这个报错一般是编译问题&#xff0c;浏览器的版本过低没通过代码 解决办法&#xff1a; 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…...

谷歌插件V3知识点

1.background.js与content.js与popup.js对比: background.js 生命周期:一开始就执行&#xff0c;最早执行且一直执行&#xff1b; 作用&#xff1a;放置全局的、需要一直运行的代码&#xff0c;权限非常高几乎调用所有Chrome api,还可以发起跨域请求&#xff1b; content.js 生…...

webrtc windows 编译,以及peerconnection_client

webrtc windows环境编译&#xff0c;主要参考webrtc官方文档&#xff0c;自备梯子 depot tools 安装 Install depot_tools 因为我用的是windows&#xff0c;这里下载bundle 的安装包&#xff0c;然后直接解压&#xff0c;最后设置到环境变量PATH。 执行gn等命令不报错&…...