Linux系统编程-信号

本文详细介绍了Linux系统编程中的信号机制,包括信号的概念、产生、递达、未决状态及其处理方式。讨论了阻塞信号集、未决信号集、信号的默认动作,并列举了各种常见的Linux信号及其用途。此外,还讲解了如何使用kill、alarm、setitimer等系统调用设置和管理信号,以及signal和sigaction函数来捕获和处理信号。通过对信号的深入理解,有助于提升Linux系统编程能力。
摘要由CSDN通过智能技术生成

概念(我比较懒,大部分纯属个人理解,非标准)

信号

简单
不能携带大量信息
需要满足特定条件才会发送

信号发出接收者会立即停止处理信号,处理结束在执行后续指令.它是软中断,并不是真正的中断
所有信号的产生处理都是内核完成的,我们只是中间的一条线

产生信号

按键产生,CTRL + C,(终止进程) CTRL + z(暂停,后台运行,可用fg恢复), CTRL + \(终止进程)等
系统调用产生, kill, raise, abort等
软件条件产生, 定时器 alarm(sleep其实就是一个定时器的封装)等
硬件异常产生, 非法访问内存(段错误), 除0(浮点数不会是inf), 内存对齐出错(总线错误)等
命令产生,kill等

递达

传送并到达进程

未决

产生和递达之间,由于阻塞等导致的状态

处理方式

每个信号都有自己的默认动作
忽略,不处理
捕捉,自行指定处理

PCB结构体task_struct中包含了信号相关信息,阻塞和未决信号集等

阻塞信号集(信号屏蔽字)

将信号加入集合,是他们屏蔽,解除屏蔽后才会处理该信号

未决信号集

信号产生,信号集中该信号位变为1,表示未决信号集.信号处理后信号位变为0(这个时刻一般很短)
信号产生由于某些原因(阻塞)不能递达,这类信号的集合称为未决信号集.解除屏蔽之前一直处于未决状态

kill -l 信号表

        0-31普通信号 有默认事件 应用程序开发
        34-64实时信号 没有默认事件 底层系统开发使用

信号四要素(很重要)

man 7 signal 查看
一个信号对应多个编号是因为不同的芯片有不同的处理方式(写宏肯定没错,代码中能用宏的地方尽可能的使用宏,在可以达到需求的前提下代码的可读性永远要放在首位)

四要素

        编号
        名称
        事件
        默认处理动作

Linux常规信号(*为常用的)

*1 SIGHUP 退出shell时,该shell启动的所有进程接收信号, 默认动作为终止进程
*2 SIGINT ctrl + c, 终端向正在运行中,由该终端启动的程序接收信号,默认动作终止进程
*3 SIGQUIT ctrl + \, 终端向正在运行中,由该终端启动的程序接收信号,默认动作终止进程
4 SIGLL CUP检测到进程执行非法指令,默认动作终止进程产生core(就是用来调试的一个文件)文件
5 SIGTRAP 由断点指令或其他trap(捕捉信号)指令产生,默认动作终止进程产生core文件
6 SIGABRT 调用abort产生该信号,默认动作终止进程产生core文件
*7 SIGBUS(总线错误) 非法访问地址和内存对齐出错,默认动作终止进程产生core文件
*8 SIGFPE 运算错误,浮点数运算,溢出,除0等算法错误,默认动作终止进程产生core文件
9 SIGKILL 无条件终止进程,此信号不能忽略,处理,阻塞,默认动作终止进程.
*10 SIGUSR1 自定义信号,可在程序中定义使用.默认动作终止进程
*11 SIGSGV(段错误) 进程访问了无效内存,默认动作终止进程产生core文件
*12 SIGUSR2 自定义信号,可在程序中定义使用.默认动作终止进程
*13 SIGPIPE Broken pipe向一个没有读端的管道写数据,默认动作终止进程
*14 SIGALRM 定时器超时,超时时间由alarm函数设置,默认动作终止进程
*15 SIGTERM 程序结束信号,与SIGKILL不同的是这个信号可以阻塞和终止,通常表示程序正常退出.执行shell命令kill 进程编号,默认动作终止进程
16 SIGSTKFLT 早期信号,保留向后兼容,默认动作终止进程
24 SIGXCPU 进程时间超过了 分配CPU的时间,系统产生该信号,默认动作为终止
25 SIGXFSZ 超过文件的最大长度设置,莫瑞诺动作终止
26 SIGVTALRM 虚拟始终超时类似SIGALRM,该信号只计算该进程占用CPU时间,默认动作终止
27 SIGPROF 类似SIGVTALRM,不只包括CPU时间还包括系统调用时间,默认动作终止
30 SIGPWR 关机,默认动作终止
31 SIGSYS 无效系统调用,默认动作终止产生core文件
34-64 实时信号,用户自定义,默认动作终止

*17 SIGCHLD 子进程状态(阻塞,死亡等)发送信号,父进程会接收该信号,默认动作忽略该信号
18 SIGCONT 如果进程已停止,,继续运行,默认动作继续/忽略
19 SIGSTOP  停止进程,信号不能忽略,处理,阻塞,默认动作暂停进程
20 SIGTSTP  ctrl + z 发出信号,停止终端交互进程的运行,默认动作暂停进程
21 SIGTTIN 后台进程读终端,默认动作暂停进程
22 SIGTTOU 后台进程写终端,默认动作暂停进程
23 SIGURG 套接字有紧急数据时,向正在运行的进程发出该信号,如果数据到达,默认动作忽略该信号
28 SIGWINCH 窗口大小变化发出,默认动作忽略
29 SIGIO 向进程发出一个异步IO事件,默认动作忽略

默认动作

term 终止进程
lgn 忽略信号
core 终止进程产生core文件
stop 暂停进程
cont 继续执行程序
SIGKILL和SIGSTOP不能忽略捕捉阻塞
事件发送信号才会递送但不一定会递达
没有特定事件信号不要乱发,需要发送信号可以使用SIGUSR1和SIGUSR2

kill(发送信号)

头文件

#include <sys/types.h&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值