Linux —— 进程信号
一,信号概念
信号是进程之间事件异步通知的一种方式,属于软中断;
系统定义的信号
- 每个信号都有一个编号和一个宏定义名称(可在signal.h查看);
- 编号34以上的为实时信号;
[wz@192 Desktop]$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
//vim /usr/include/bits/signum.h
/* Signals. */
#define SIGHUP 1 /* Hangup (POSIX). */
#define SIGINT 2 /* Interrupt (ANSI). */
#define SIGQUIT 3 /* Quit (POSIX). */
#define SIGILL 4 /* Illegal instruction (ANSI). */
#define SIGTRAP 5 /* Trace trap (POSIX). */
#define SIGABRT 6 /* Abort (ANSI). */
#define SIGIOT 6 /* IOT trap (4.2 BSD). */
#define SIGBUS 7 /* BUS error (4.2 BSD). */
#define SIGFPE 8 /* Floating-point exception (ANSI). */
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
#define SIGSEGV 11 /* Segmentation violation (ANSI). */
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
#define SIGPIPE 13 /* Broken pipe (POSIX). */
#define SIGALRM 14 /* Alarm clock (POSIX). */
#define SIGTERM 15 /* Termination (ANSI). */
#define SIGSTKFLT 16 /* Stack fault. */
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
#define SIGCHLD 17 /* Child status has changed (POSIX). */
#define SIGCONT 18 /* Continue (POSIX). */
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
#define SIGTSTP 20 /* Keyboard stop (POSIX). */
#define SIGTTIN 21 /* Background read from tty (POSIX). */
#define SIGTTOU 22 /* Background write to tty (POSIX). */
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
#define SIGPWR 30 /* Power failure restart (System V). */
#define SIGSYS 31 /* Bad system call. */
#define SIGUNUSED 31
ctrl + c
此键盘输入将产生一个硬件中断,被OS获取并解释成信号,发送给目标前台进程;此前台进程收到信号,引起进程退出;
- ctrl + c 产生的信号只能发送给前台进程;如一个命令后加上&,可放入后台运行;
- shell可同时运行一个前台进程和任意多个后台进程,只有前台进程才可接收ctrl+c产生的信号;
- 前台进程在运行过程中可随时按下ctrl+c,即该进程的用户空间代码执行到任何位置都有可能收到SIGINT信号而终止,所以信号相当于进程的控制流来说是异步的;
信号的产生
信号的阻塞
信号的捕捉
二,信号的产生
- 通过终端按键产生信号
- 调用系统函数向进程发送信号
- 由软件条件产生信号
- 硬件异常产生信号
1,通过终端按键产生信号
- SIGINT默认处理动作为终止进程;
- SIGQUIT默认处理动作为终止进程并Core Dump;
Core Dump,即当一进程异常终止时,可选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core(叫做core dump);异常终止通常是因为bug,如非法内存访问导致的段错误,事后可调试器检查core文件以查清错误原因(叫做事后调试Post-mortem Debug);一个进程允许产生多大的core文件取决于进程的Resource Limit(此消息保存于PCB中);默认是不允许产生core文件的,因为core文件可能包含用户密码等敏感消息;在开发阶段可使用ulimit命令改变此限制,允许产生core文件;用ulimit命令改变shell进程的Resource Limit,允许core文件最大1024K(ulimit -c 1024);
[wz@192 ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7154
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[wz@192 ~]$ ulimit -c 1024
[wz@192 ~]$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7154
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
#include <stdio.h>
#include <unistd.h> int main(){ int count = 0; while(1){ printf("%d,pid:%d\n",count++,getpid()); sleep(1); } return 0;
}
//ctrl+\终止进程并生成core文件
[wz@192 Desktop]$ ./test
0,pid:44041
1,pid:44041
2,pid:44041
3,pid:44041
4,pid:44041
5,pid:44041
^\Quit (core dumped)
[wz@192 Desktop]$ ll
total 268
-rw-------. 1 wz wz 253952 8月 31 08:31 core.44041
-rw-rw-r--. 1 wz wz 60 8月 29 08:15 makefile
-rwxrwxr-x. 1 wz wz 8464 8月 31 08:29 test
-rw-rw-r--. 1 wz wz 157 8月 31 08:31 test.c
[wz@192 Desktop]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/wz/Desktop/test...(no debugging symbols found)...done.
(gdb) core-file core.44041
[New LWP 44041]
Core was generated by `./test'.
Program terminated with signal 3, Quit.
#0 0x00007ff68f2e19e0 in __nanosleep_nocancel () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
(gdb)
2,调用系统函数向进程发送信号
//也可kill -11 51993
[wz@192 ~]$ kill -SIGSEGV 51993
[wz@192 Desktop]$ ./test
0,pid:51993
1,pid:51993
2,pid:51993
Segmentation fault (core dumped)

- kill命令是调用kill函数实现的,该函数可给指定进程发送特定信号;
- raise函数可给当前进程发送指定信号(自己给自己发送信号);
- abort函数使当前进程接收到信号而异常终止;



3,由软件条件产生信号
- alarm函数,可设定一个闹钟,告诉内核在多少秒后给当前进程发送SIGALRM信号;
- SIGALRM信号,默认处理动作为终止当前进程;

#include <stdio.h>
#include <unistd.h> int main(){ int count = 0; alarm(1); while(1){ printf("%d,pid:%d\n",count++,getpid()); } return 0;
}
[wz@192 Desktop]$ ./test
...
174838,pid:53084
174839,pid:53084
174840,pid:53084
174841,pid:53084
174842,pid:53084Alarm clock
4,硬件异常产生信号
即被硬件以某种方式检测到并通知内核,然后内核向当前进程发送适当的信号;如当前进程执行了除0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进程;在如当前进程访问了非法内存地址,内核将异常解释为SIGSEGV信号发送给进程;
在C/C++中除零、内存越界等异常,在系统层面是被当成信号处理的;
信号捕捉

#include <stdio.h>
#include <unistd.h>
#include <signal.h> void handler(int sig){ printf("catch a sig: %d\n", sig);
}
int main(){ signal(2, handler); int count = 0; while(1){ printf("%d,pid:%d\n",count++,getpid()); sleep(1); } return 0;
}
[wz@192 Desktop]$ ./test
0,pid:53899
1,pid:53899
^Ccatch a sig: 2
2,pid:53899
3,pid:53899
4,pid:53899
^Ccatch a sig: 2
野指针异常
#include <stdio.h>
#include <unistd.h>
#include <signal.h> void handler(int sig){ printf("catch a sig: %d\n", sig);
}
int main(){ //signal(SIGSEGV, handler); int *p = NULL; *p = 100; int count = 0; while(1){ printf("%d,pid:%d\n",count++,getpid()); sleep(1); } return 0;
}
[wz@192 Desktop]$ ./test
Segmentation fault (core dumped)
所有信号的产生,最终都是由OS进行执行的;
信号不是立即处理的,是在合适的时候才进行处理的;
相关文章:
Linux —— 进程信号
一,信号概念 信号是进程之间事件异步通知的一种方式,属于软中断; 系统定义的信号 每个信号都有一个编号和一个宏定义名称(可在signal.h查看);编号34以上的为实时信号; [wz192 Desktop]$ kill -…...
Android笔记 自定义控件时drawText字符串宽度的3种计算方式
String str "hello"; canvas.drawText(str, x, y, mPaint);//1. 粗略计算文字宽度: float width mPaint.measureText(str);//2. 计算文字的矩形,可以得到宽高: Rect rect new Rect(); mPaint.getTextBounds(str, 0, str.length(…...
ChatRWKV 学习笔记和使用指南
0x0. 前言 Receptance Weighted Key Value(RWKV)是pengbo提出的一个新的语言模型架构,它使用了线性的注意力机制,把Transformer的高效并行训练与RNN的高效推理相结合,使得模型在训练期间可以并行,并在推理…...
Particle Life粒子生命演化的MATLAB模拟
Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算法感兴趣才写此博客。所以如果有…...
golang中byte和rune的区别?
golang中byte和rune的区别? rune和byte在go语言中都是字符类型,从源码来看他们都是别名形式 // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsigned…...
AI图像行为分析算法 opencv
AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析,AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定,并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可…...
MATLAB制图代码【第二版】
MATLAB制图代码【第二版】 文档描述 Code describtion: This code is version 2 used for processing the data from the simulation and experiment. Time : 2023.9.3 Author: PEZHANG 这是在第一版基础上,迭代出的第二版MATLAB制图代码,第二版的特点是…...
5.0: Dubbo服务导出源码解析
#Dubbo# 文章内容 Dubbo服务导出基本原理分析Dubbo服务注册流程源码分析Dubbo服务暴露流程源码分析服务导出的入口方法为ServiceBean.export(),此方法会调用ServiceConfig.export()方法,进行真正的服务导出。 1. 服务导出大概原理 服务导出的入口方法为ServiceBean.export…...
python自动化测试-自动化基本技术原理
1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情,必须要有扎实的计算机理论基础,才能看到深层次的本质东西。 …...
lodash 之 _.isEmpty
lodash.isEmpty() 是 Lodash 库中的一个函数,用于检查给定值是否为空。它可以用于判断对象、数组、字符串等不同类型的值是否为空。 const _ require(lodash);console.log(_.isEmpty(null)); // 输出: trueconsole.log(_.isEmpty(undefined)); // 输出: trueconso…...
layui数据表格实现表格中嵌套表格,并且可以折叠展开
效果: 思路: 1、最外层的表格先渲染,在done回调中向每个tr后面插入一个用来嵌套子级表格的tr。 tr的class和table的id需要用索引 i 关联 //向每一行tr后面追加显示子table的trlet trEles $(".layui-table-view[lay-idlist] tbody tr&…...
云端笔记系统-自动化测试
文章目录 1. 思维导图编写 Web 自动化测试用例2. 创建测试项目3. 根据思维导图设计【云端笔记】自动化测试用例3.1. 准备工具类3.2. 测试注册页面3.3. 测试登陆页面3.4. 测试添加博客页3.5. 测试我的博客列表页3.6. 测试修改博客页3.7. 测试博客列表页3.8. 测试博客详情页3.9. …...
将帅要避免五个方面的弱点:蛮干、怕死、好名、冲动、溺爱民众
将帅要避免五个方面的弱点:蛮干、怕死、好名、冲动、溺爱民众 【安志强趣讲《孙子兵法》第28讲】 【原文】 是故屈诸侯者以害,役诸侯者以业,趋诸侯者以利。 【注释】 趋:归附、依附。 【趣讲白话】 所以,用祸患威逼诸侯…...
2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆
2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆...
vue的第3篇 第一个vue程序
一 vue的mvvm实践者 1.1 介绍 Model:模型层, 在这里表示JavaScript对象 View:视图层, 在这里表示DOM(HTML操作的元素) ViewModel:连接视图和数据的中间件, Vue.js就是MVVM中的View Model层的实现者 在M…...
线性求逆元
先暴力求出 1 n ! \frac 1 {n!} n!1往回推出 1 i ! \frac 1 {i!} i!1 1 i ( i − 1 ) ! i ! \Large \frac 1 i\frac{(i-1)!}{i!} i1i!(i−1)!...
第一章 USB应用笔记之USB初步了解
USB应用笔记之USB初步了解 文章目录 USB应用笔记之USB初步了解前言USB的优点:USB版本发展USB速度以及电气接口USB传输过程USB开发抓包工具:USB传输方式1.控制传输特点:2.中断传输的特点3. 批量传输的特点4.实时传输(同步传输)的特…...
小白入门python
建议用vscode进行代码学习 vscode下载地址:Download Visual Studio Code - Mac, Linux, Windows 左侧点击扩展安装python,右下角选择python版本,记得配置系统环境变量,python在系统(cmd)的版本由环境变量优先级决定,在编程软件中由自己选择解释器...
《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.17集群(多主多从)》
一、架构图 如下图所示: 二、环境信息 1、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …...
Adobe Illustrator 2023 for mac安装教程,可用。
Adobe Illustrator 是行业标准的矢量图形应用程序,可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作,从网页图标和产品包装到书籍插图和广告牌。此版本是2023版本,适配…...
Codex CLI 多环境配置秘籍:如何用 profiles 一键切换 OpenAI/Mistral/Ollama
Codex CLI 多环境配置秘籍:如何用 profiles 一键切换 OpenAI/Mistral/Ollama 当你的开发工作流需要同时对接多个AI模型提供商时——比如公司项目使用OpenAI的GPT-4,个人实验采用本地Ollama托管的Mistral,而临时调试又需要连接Azure的API端点—…...
电子课本下载终极指南:三步完成国家教育平台PDF高效获取
电子课本下载终极指南:三步完成国家教育平台PDF高效获取 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 在数字化教育浪潮中,教师和学生面…...
Java大厂面试揭秘:从Spring Boot到Kubernetes的技术深挖
Java大厂面试揭秘:从Spring Boot到Kubernetes的技术深挖 场景背景 王大壮是一位初入职场的程序员,怀揣着对互联网大厂的向往,来到了一家知名互联网企业参加Java开发岗的面试。面试官老李以严肃的态度,针对核心技术栈进行了深挖式提…...
CentOS 6下OpenSSH从5.3升级到8.0的完整避坑指南(附Telnet备用方案)
CentOS 6环境下OpenSSH安全升级全流程:从风险规避到应急通道搭建 当一台运行CentOS 6的服务器在安全扫描中被标记出OpenSSH 5.3的高危漏洞时,任何有经验的运维工程师都会感到脊背发凉——这就像发现自家大门用的还是二十年前的挂锁。但更令人焦虑的是&am…...
UE后期处理材质实战:从黑白蒙版到卡通渲染的进阶应用
1. 黑白蒙版遮罩的底层原理与应用 在UE4后期处理材质中,黑白蒙版遮罩是最基础也最实用的功能之一。我第一次接触这个功能时,被它强大的选择性处理能力惊艳到了——它能像手术刀一样精准地分离出场景中的特定物体。 核心原理其实很简单:通过Sc…...
实战指南 | TSMaster 的 CAN UDS 诊断自动化流程与 BootLoader 刷写详解
1. TSMaster诊断控制台深度解析 诊断控制台是TSMaster进行UDS诊断的核心操作界面,相当于工程师与ECU对话的"翻译器"。我第一次接触这个界面时,被它清晰的四分区设计惊艳到了——就像汽车仪表盘把转速、车速、油量分区域显示一样直观。 服务命令…...
PySpur工作流追踪终极指南:实时监控AI代理执行过程的10个技巧
PySpur工作流追踪终极指南:实时监控AI代理执行过程的10个技巧 【免费下载链接】pyspur Minimalist AI Agent Graph UI 项目地址: https://gitcode.com/gh_mirrors/py/pyspur PySpur是一个极简主义的AI代理图形化界面工具,专为构建和监控复杂AI工作…...
在Jetson Nano上构建海康威视相机Docker镜像:从SDK集成到Python应用部署
1. 环境准备与基础配置 在Jetson Nano上构建海康威视相机Docker镜像的第一步,是确保硬件和基础软件环境就绪。我建议从官方渠道下载最新的JetPack SDK,这个工具包包含了CUDA、cuDNN等深度学习推理必需的组件。安装完成后,记得运行nvidia-smi命…...
PDF文本高效提取:用pdftotext实现秒级文档内容解析
PDF文本高效提取:用pdftotext实现秒级文档内容解析 【免费下载链接】pdftotext Simple PDF text extraction 项目地址: https://gitcode.com/gh_mirrors/pd/pdftotext 破解PDF提取痛点:为什么你需要专业工具? 每天面对数十份PDF文档却…...
springboot+vue基于web的针对老年人的景区订票系统的设计与实现
目录系统功能模块划分关键技术实现特殊考量因素项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统功能模块划分 用户端功能(老年人友好设计) 注册登录:支持手机号验证、子女代注册、大字体…...
