面试常问-----------------Linux信号之信号的产生、信号的捕捉、其他几个重要的信号

本文详细介绍了Linux信号的原理和处理方式,包括理解信号的特点、阻塞信号的概念、进程的前台与后台状态、信号的产生、处理方式(忽略、默认动作、捕捉)以及关键函数如sigprocmask和sigsuspend的应用。同时,文章还讨论了SIGCHLD信号在处理僵尸进程中的作用。
摘要由CSDN通过智能技术生成

理解信号

拿生活中的例子来说吧。下课的铃声是一种信号,当我们接收到这种信号就知道该去吃饭或者是去玩,那么计算机中的信号也是类似的,进程可以发送信号也可以接受信号,信号处理时可以选择忽略也可能执行自定义的信号。
总而言之,信号有以下特点:
1、信号的种类有很多种。Linux下可以利用kill -l显示所有的信号,其中31号及以下为普通信号,34号及以上是实时信号。
2、在发生之前就知道对应此信号会做出相应的处理工作。
3、不同的信号处理的方式也不同。

理解阻塞信号

1、信号相关概念

信号递达:实际执行处理信号的动作
信号未决:信号从产生到递达之间的状态称为信号未决,等待被递达。
进程可以选择阻塞信号,被阻塞的信号将保持在未决状态,直到进程解除阻塞才执行递达的动作

2、从内核角度来深入理解:
这里写图片描述
从上图我们可以看出信号(1)在pending和block中的标志位都是0,说明没有产生过也没有被阻塞,递达后执行默认操作;信号(2)被阻塞,所以无法被递达,还在pending队列中,虽然它要执行的动作是忽略,但是没递达之前就是不会执行(区分未决和忽略);信号(3)没有产生过,但是block对应位置是1,说明一产生就阻塞,对应执行sighandler函数。

如果在进程解除对某信号的阻塞之前这种信号产生过很多次,将如何处理????
posix.1允许系统递送该信号一次或者多次,但是普通信号到达多次,解除阻塞只处理一次,而实时信号,每收到一次就处理一次。

3、信号集(sigset_t类型)
阻塞和未决都是利用一个标志位0或者1(非0即1)来表示,所以利用此类型可以表示信号的“有效”或者“无效”状态,表示是否处于阻塞或者是否处于未决状态。
4、信号集操作函数

#include<signal.h>
int sigemptyset(sigset_t* set);//全置0
int sigfillset(sigset_t* set);//全置1
int sigaddset(sigset_t* set ,int signo);
int sigd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值