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

linux系统信号简介

原文地址:linux系统信号简介 – 无敌牛

欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等

介绍

信号是一种重要的进程间通讯方式,这些信号有的有特定的用法,有的可作为扩展和自定义使用。并且大多数信号是可以被重新定义处理函数的。只有两个信号 SIGKILL 和 SIGSTOP 是不可以被捕捉、忽略和阻塞的,这是为了操作系统更好的控制进程和系统资源,防止滥用信号,确保系统的稳定性。此篇文章逐一解释一下每一个信号的作用。

可以用系统指令:kill -l 查看系统支持的信号,输出内容如下:

可以看出,linux 系统一般支持 1-31、34-64 共62个信号。其中:

1-31 是传统信号,这些信号在Unix和类Unix操作系统中是标准化的,每个信号都有其特定的用途和行为。

34-64 是实时信号,用于应用程序之间自定义的进程间通信。实时信号的主要特点是它们支持排队,这意味着如果多个相同类型的实时信号被发送给同一个接收者,接收者会按顺序接收到每一个信号,而不会丢失任何信号。相比之下,传统信号如果多次发送,则可能只会接收到一次。另外它们比传统信号具有更高的优先级

信号解释

写了一小段代码,来逐一测试进程接收到信号后,默认的处理方式。测试不同的信号,把下边的代码中 SIGHUP 替换掉就可以了。可通过指令:gcc -o e_tsig1 tsig1.c 编译代码。操作系统发行版不一样,默认处理方式可能会不一样,但是不会相差太多。代码如下:

// gcc -o e_tsig1 tsig1.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

int main() {
    unsigned int mypid = 0 ;
    printf("my pid is :%u\n", (mypid = getpid()) ) ;
    kill(mypid, SIGHUP) ;
    while(1) {
        printf("still running %u\n", mypid) ;
        sleep(1) ;
    }
}

SIGHUP 1 :Hangup 终端挂断信号,通常在终端连接中断、用户从系统注销、网络连接断开时产生。

系统默认处理方式:终止进程。默认处理程序测试:

通常情况下,捕捉此信号,重新处理函数,用来重新加载程序配置使用。systemctl reload xxxx.service 默认就是发送的此信号,这就需要接收信号的进程响应此信号,重写信号处理函数。


SIGINT 2 :Interrupt 中断信号,用户输入 Ctrl + C 就是发送的此信号,通常用于快速终止进程。

系统默认处理方式:进程快速被终止进程。默认处理程序测试:


SIGQUIT 3 :Quit 退出信号,并生成核心转储文件(coredump文件),可由用户输入 Ctrl + \ 发送此信号。

系统默认处理方式:进程退出,生成 coredump 文件。默认处理程序测试:


SIGILL 4 :Illegal Instruction 非法指令信号。这里的指令指的是CPU指令,操作系统内核在检测到进程尝试执行非法指令时自动发起。

系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:

通常在编译、运行二进制或者硬件故障的情况下会发生。在调试代码的时候,内存溢出的情况下经常会出现此信号,数据被覆盖,尤其是代码段被覆盖,导致指令错乱。


SIGTRAP 5 :Trace/Breakpoint Trap 断点信号。通常用于调试。

系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:


SIGABRT 6 :Abort 进程异常终止信号,由abort(3)函数调用触发。

系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:


SIGBUS 7 :Bus 总线错误,通常指非法内存地址访问。

系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:


SIGFPE 8 :Floating Point Exception 浮点运算错误,通常指除以0错误。

系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:


SIGKILL 9 :Kill 强制终止进程。

系统默认处理方式:终止进程。默认处理程序测试:

这个信号不能被捕获、阻塞或忽略,用于立即结束进程。它是当其他信号无法使进程退出时的最后手段。


SIGUSR1 10 :User Defined Signal 1 用户自定义信号1。

系统默认处理方式:终止进程。默认处理程序测试:

一般用来被重写信号处理函数。


SIGSEGV 11 :Segmentation Violation 断错误信号。发生了非法内存地址访问时,会收到此信号。

系统默认处理方式:终止进程并创建核心转储文件。默认处理程序测试:

内存溢出、double free、访问地址越界等都会报此错误。


SIGUSR2 12 :User Defined Signal 2 用户自定义信号2。

系统默认处理方式:终止进程。默认处理程序测试:

一般用来被重写信号处理函数。


SIGPIPE 13 :Broken Pipe 管道写入错误信号。通常表示向已关闭的管道写入数据。

系统默认处理方式:终止进程。默认处理程序测试:


SIGALRM 14 :Alarm Clock 定时器到期信号,通常由 alarm 函数设置。

系统默认处理方式:终止进程。默认处理程序测试:


SIGTERM 15 :Terminate 请求终止进程信号,通常用于优雅地关闭进程。

系统默认处理方式:终止进程。默认处理程序测试:

一般会重写此信号的处理函数,做一些必要的资源回收和关闭。systemctl stop xxxx.service 默认就是发送的 SIGTERM 信号。此信号 和 SIGINT 几乎一样的功能。


SIGSTKFLT 16 :Stack Fault 栈故障信号。它主要用于旧的 SPARC 架构上的浮点栈溢出。

系统默认处理方式:终止进程。默认处理程序测试:


SIGCHLD 17 :Child Process Stopped or Terminated 子进程状态改变信号。当子进程停止或终止时发送给父进程

系统默认处理方式:忽略。默认处理程序测试:

如果需要处理子进程的返回信息,需要对此信号添加信号处理函数。


SIGCONT 18 :Continue 恢复进程信号。当进程被暂停的时候,通过此信号继续让进程执行。

系统默认处理方式:继续执行进程。默认处理程序测试:

单独触发此信号是没有意义的,当进程被 SIGSTOP 、SIGTSTP 、SIGTTIN 、SIGTTOU 暂停或者由于其他原因暂停的时候,收到此信号,就会继续执行。


SIGSTOP 19 :Stop 暂停进程信号。暂停进程,不能被阻塞、捕获或忽略。进程可以被 SIGCONT 再次启动。

系统默认处理方式:暂停进程。默认处理程序测试:


SIGTSTP 20 :Terminal Stop 暂停进程信号。暂停进程,可以被捕获或忽略。进程可以被 SIGCONT 再次启动。

系统默认处理方式:暂停进程。默认处理程序测试:


SIGTTIN 21 :Background Read from TTY 终端输入信号。暂停进程,收到此信号代表后台试图读取控制终端提供的数据。进程可以被 SIGCONT 再次启动。

系统默认处理方式:暂停进程。默认处理程序测试:


SIGTTOU 22 :Background Write from TTY 终端输出信号。暂停进程,收到此信号代表后台试图把数据写入控制终端。进程可以被 SIGCONT 再次启动。

系统默认处理方式:暂停进程。默认处理程序测试:


SIGURG 23 :Urgent Condition on Socket 紧急数据可用信号。接收到此信号说明套接字上有紧急条件需要处理。

系统默认处理方式:忽略。默认处理程序测试:

信号用于通知进程其套接字上有紧急数据到达。默认情况下,进程会忽略这个信号,但可以通过安装信号处理函数来捕获并处理紧急数据。这对于需要实时响应的通信场景非常有用。通过管理 SIGURG 信号,可以提高应用程序的实时性和响应能力。


SIGXCPU 24 :Exceeded CPU Time Limit CPU使用超时信号。在进程超过为其分配的CPU时间限制时会接收到来自系统的发送的这个信号。

系统默认处理方式:终止进程并创建核心转储。默认处理程序测试:

在执行 ulimit -t 可以查看系统设置的CPU限制,一般默认都是不限制的。或者通过 struct rlimit 设置进程占用CPU时间,一旦超过 CPU 时间限制,就会触发此信号。


SIGXFSZ 25 :Exceeded File Size Limit 超过文件大小限制信号。在进程超过文件大小限制时会接收到来自系统的发送的这个信号。

系统默认处理方式:终止进程并创建核心转储。默认处理程序测试:

在执行 ulimit -f 可以查看系统设置的文件大小限制,一般默认都是不限制的。或者通过 struct rlimit 设置进程打开文件限制,一旦超过限制,就会触发此信号。


SIGVTALRM 26 :Virtual Timer Expired 虚拟定时器到期信号。

系统默认处理方式:终止进程。默认处理程序测试:

虚拟定时器是一种基于进程的用户态时间的定时器,与实际的系统时间无关,只计算进程在用户态下实际运行的时间。


SIGPROF 27 :Profiling Timer Expired 性能分析定时器到期。

系统默认处理方式:终止进程。默认处理程序测试:

记录程序在不同部分的执行时间,帮助识别瓶颈和优化代码。可以通过 setitimer 系统调用来设置性能分析定时器。setitimer 可以设置三种类型的定时器,其中包括性能分析定时器(ITIMER_PROF)。


SIGWINCH 28 :Window Change 窗口大小改变信号。在终端窗口大小发生变化时发送给进程。

系统默认处理方式:忽略。默认处理程序测试:

通过理解和管理 SIGWINCH 信号,可以提高应用程序的用户体验和适应性。


SIGIO 29 :Input/Output Possible I/O可操作信号。通知进程某个文件描述符已经准备好进行 I/O 操作,通常用于异步 I/O 操作。

系统默认处理方式:终止进程。默认处理程序测试:


SIGPWR 30 :Power Failure 电源故障或即将关机信号。通知进程电源即将断开,通常是由于系统检测到电源故障或即将关机而发送的。

系统默认处理方式:终止进程。默认处理程序测试:

通过设置此信号的处理函数,可以在一定程度上防止突然断电带来的系统损坏。


SIGSYS 31 :Bad System Call 无效系统调用信号。

系统默认处理方式:终止进程并生成核心转储文件。默认处理程序测试:


SIGRTMIN — SIGRTMAX >=34 & <=64:Real Time min — max 实时信号。

系统默认处理方式:终止进程。默认处理程序测试,以 SIGRTMIN 为例:


http://www.kler.cn/a/419141.html

相关文章:

  • PHP如何在MongoDB中使用正则表达式进行查询
  • LabVIEW内燃机气道试验台测控系统
  • 深入理解AIGC背后的核心算法:GAN、Transformer与Diffusion Models
  • 【python】图像、音频、视频等文件数据采集
  • S4 UPA of AA :新资产会计概览
  • 用c语言完成俄罗斯方块小游戏
  • Scala—列表(可变ListBuffer、不可变List)用法详解
  • FAT文件系统
  • 【ETCD】etcd简单入门之基础操作基于etcdctl进行操作
  • arkTS:持久化储存UI状态的基本用法(PersistentStorage)
  • 基于Java Springboot宠物医院微信小程序
  • UI设计-色彩、层级、字体、边距(二)
  • 民锋视角:数据分析如何助力金融决策
  • 【docker集群应用】Docker--harbor私有仓库部署与管理
  • C语言——管理系统
  • glog在vs2022 hello world中使用
  • MySQL Inception工具
  • 泷羽sec-shell(5)字符串运算符和逻辑运算符 学习笔记
  • 编程基础篇
  • 英语写作中以rationale 替代reason(理由)
  • node.js基础学习-querystring模块-查询字符串处理(三)
  • 二分搜索(二)搜索插入位置
  • javascript切换类、删除类、修改类以及增加类
  • 低代码与微服务融合在医疗集团中的补充应用探究
  • 计算机网络--网络安全测试
  • 【关闭or开启电脑自带的数字键盘】