科林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:Linux或Unix系统支持的经典的消息机制,用于处置进程,挂起进程或杀死进程 kill -l #查看系统支持的信号 1~31 Unix经典信号(软件开发工程师) 32、33信号被系统隐藏…...
C++:map和set类
关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面 存储的是元素本身。那什么是关…...
[C/C++] -- 代理模式
代理模式是一种结构型设计模式,允许一个对象(代理)控制另一个对象的访问。代理对象通常充当客户端和实际目标对象之间的中间人,从而控制对目标对象的访问,可以在访问前后进行一些额外的处理。 代理模式的优点包括&…...
电商平台遭遇DDOS、CC攻击有什么防护方案
电商平台遭遇DDOS、CC攻击有什么防护方案?在数字化浪潮的推动下,电商平台已成为现代商业的重要组成部分,为消费者提供便捷、多样的购物体验。然而,随着业务的发展,电商平台也面临着日益严峻的网络安全挑战,…...
什么是 IIS
什么是 IIS 一、什么是 IIS二、IIS 的功能三、IIS 几点说明四、IIS 的版本五、IIS 常见的组合 欢迎关注【云边小网安】 一、什么是 IIS IIS:指 Internet Information Services ,是一种由微软公司开发的 Web 服务器应用程序。IIS:是一种 Web …...
京东页面(黏性定位的实现)
前言: 本文章将分享一些我这周在制作京东页面的实现部分,页面表面大体和京东页面差不多,在里面加了一点script,但是很容易理解,希望大家看到可以有所收获,如果我有哪部分写的不太好,欢迎大家来跟我交流! 🥰个人主页:心.c 🥳文章专题:京东页面制作 &#…...
【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第6章 安装Samba
RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…...
json-server 模拟接口服务
前端开发经常需要模拟接口请求,可以通过 json-server 实现。 1. 安装 json-server 在前端项目的终端命令行中执行 npm i json-server2. 创建数据源 在项目中新建文件 db.json ,与 package.json 同级,内容为模拟的数据 注意 json 文件对格式…...
pycharm 将项目连同库一起打包及虚拟环境的使用
目录 一、创建虚拟环境 1、用 anaconda 创建 2、Pycharm 直接创建 二、虚拟环境安装第三方库 1、创建项目后,启动终端(Alt F12),或者点击下方标记处。 2、使用 pip 或者 conda 来进行三方库的安装或卸载 3、将项目中的库放入文档,便于…...
GO语言核心30讲 实战与应用 (第三部分)
原站地址:Go语言核心36讲_Golang_Go语言-极客时间 一、io包中的接口和工具 1. strings.Builder、strings.Reader 和 bytes.Buffer 这些类型实现了 io 包的很多接口,目的是什么? 是为了提高不同程序实体之间的互操作性。 程序实体是指比如网…...
HttpServletRequest对象
1.作用 主要作用是用来接收客户端发送过来的请求信息,由servlet容器封装好传递给service()方法 2.常用方法 常用方法描述StringBuffer getRequestURL()获取客户端发送请求时的完整URLString getRequestURI()获取请求行中的资源名称部分(项目名称开始&…...
Linux入门攻坚——23、DNS和BIND基础入门1
DNS——Domain Name Service,协议(C/S,53/udp,53/tcp) BIND——Berkeley Internet Name Domain,ISC(www.isc.org) 互联网络上主机之间的通信依靠的是IP,而人或程序一般使…...
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、设置环境变量: 3、检查是否设置成功及版本 4、执行命令: android update project -p . -n “projectname”(例如:android update project --target 1 -p . -n “Couplet”)(只输入红色部分也是可以的…...
条件变量解决同步问题之打印金鱼
说明 本代码为jyy老师上课演示条件变量解决同步问题示例(本人只做记录与分享) 本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释 问题描述 有三类线程 T1 若干: 死循环打印< T2 若干: 死循环打印> T3 若干: 死循环打印_ 任务: 对线程同步,使得屏幕…...
10分钟了解Golang泛型
泛型是Golang在1.18版本引入的强大工具,能够帮助我们在合适的场合实现简洁、可读、可维护的代码。原文: Go Generics: Everything You Need To Know 导言 可能有人会觉得Go泛型很难,因此想要借鉴其他语言(比如Java、NodeJS)的泛型…...
鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口
系列篇从内核视角用一句话概括shell的底层实现为:两个任务,三个阶段。其本质是独立进程,因而划到进程管理模块。每次创建shell进程都会再创建两个任务。 客户端任务(ShellEntry): 负责接受来自终端(控制台)敲入的一个个字符&…...
TypeScript在前端项目的渐进式采用策略
渐进式采用 TypeScript 在前端项目中的策略通常包括: 引入TypeScript 如果我们有一个简单的JavaScript模块utils.js,它包含一个函数用于计算两数之和: // utils.js export function add(a, b) {return a b; }首先,我们将文件扩展名改为.t…...
C++容器常用集合(附传送门)
C常用的容器: string容器 C容器——string-CSDN博客 储存字符串的 vector容器 C容器——vector-CSDN博客 向量是动态数组,可以自动扩展以容纳更多元素。 插入和删除元素的时间复杂度取决于操作的位置 tuple容器(元组) C容器…...
基于springboot的校园资料分享平台源码数据库
基于springboot的校园资料分享平台源码数据库 随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求,创…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
