Linux信号相关

信号的概念

共性

1.简单
2.不能携带大量的信息
3.满足某个特定的条件才发送

信号的机制

信号是软件层面上的“中断”。一旦信号产生,无论程序执行到什么位置,必须立即停止运行,处理信号,处理结束,再执行后续命令。
所有信号都是由内核产生及处理的。

与信号相关的事件和状态

产生信号
1.按键产生
2.系统调用产生 kill,raise,abort 函数
3.软件条件产生 定时器alarm
4.硬件异常产生 如:非法访问内存 (段错误) , 除0 ,内存对齐错误(总线错误)
5.命令产生 kill命令
递达
内核将信号递送并且到达进程,直接被内核处理掉。
未决
产生和递达之间的状态。主要由于阻塞(屏蔽)导致该状态
信号的处理方式
1.执行默认动作
2.忽略
3.捕捉(用户处理函数)
阻塞信号集(信号屏蔽字)
本质:位图 用来记录信号的屏蔽状态。一旦被屏蔽的信号,在解除屏蔽前,一直处于未决态。
未决信号集
本质:位图。用来记录信号的处理状态。该信号集中的信号,表示已经产生但未被处理。
在这里插入图片描述在这里插入图片描述
需要了解的信号(常规信号)在这里插入图片描述

信号4要素

1.编号
2.名称
3.对应事件
4.默认处理动作
使用之前一定要确定4要素
在这里插入图片描述在这里插入图片描述在这里插入图片描述

kill函数和kill命令

命令:kill -信号编号 pid_t

函数

pid_t pid;
pid = fork();
if(pid > 0){
	while(1);
} else if(pid == 0){
	sleep(2);
	kill(getppid(),SIGKILL);
}

pid = 0 发送信号给与调用kill函数进程属于同一进程组的所有进程
pid > 0 发送信号给指定的进程
pid < -1 取|pid|发送给对应进程组
pid = -1 发送给进程有权限发送的系统中的所有进程
父进程和进程组的id一样
在这里插入图片描述

alarm函数

使用自然计时法。
每个程序只有一个闹钟
定时发送SIGALRM信号给当前进程

unsigned int alarm(unsigned int secends);
//返回值代表上次定时剩下的秒数,无错误现象

time命令:查看程序执行时间

实际时间 = 用户时间 + 内核时间 + 等待时间
说明优化瓶颈在I/O

setitimer函数

更精确,可实现周期定时
在这里插入图片描述
it_value是第一个闹钟 只能触发一次
it_interval时第二个闹钟,可以循环触发

which参数:
在这里插入图片描述

struct itimerval it,oldit;
setitimer(ITIMER_REAL,&it,&oldit);

具有返回值-1代表失败,0代表成功

信号集操作函数

设置自定义信号集

sigset_t set; 自定义信号集
sigemptyset(sigset_t *set); 清空信号集,全部置0
sigfillset(sigset_t *set); 填满信号集,全部置1
sigaddset(sigset_t *set,int signum); 将一个信号添加到集合中
sigdelset(sigset_t *set,int signum);  移除
sigismember(sigset_t *set,int signum);  判断一个信号是否在集合中,返回1代表存在,不在返回0-1代表错误

设置信号屏蔽字和解除屏蔽

sigprocmask(int how,const sigset *set,sigset *oldset);

how:SIG_BLOCK:设置阻塞
SIG_UNBLOCK:取消阻塞
SIG_SETMASK:用自定义的set替换mask
set:自定义set
oldset:旧有的mask
查看未决信号集
sigpending(sigset_t *set);
set:传出的未决信号集
在这里插入图片描述

信号捕捉

signal函数
注册一个信号捕捉函数:是内核帮你抓信号,不是函数抓
在这里插入图片描述

sigaction(重点)

struct sigaction {
               void     (*sa_handler)(int); //返回值为void的参数为int类型的函数,简称回调函数
              // void     (*sa_sigaction)(int, siginfo_t *, void *);
               sigset_t   sa_mask;//信号捕捉函数调用时,sa_mask会替换mask,执行完毕,就会恢复。
               int        sa_flags;//传0,表示屏蔽此信号。
              // void     (*sa_restorer)(void);
           };


在这里插入图片描述
特性
在这里插入图片描述
第三点结合位图只有二进制0和1理解,所以不支持排队
在这里插入图片描述

SIGCHID信号

产生条件:
子进程状态条件发生变化。
1.终止
2.暂停
3.暂停后恢复
借助SIGCHID回收子进程
在这里插入图片描述

中断系统调用

慢速系统调用:造成进程永久阻塞。如果在阻塞期间收到一个信号,该系统调用就被中断,不在继续执行;也可以设定系统调用是否重启。如read,write,pause,wait。
sa_flags可以设定被系统调用后是否重启。
SA_INTERRURT不重启
SA_RESTART重启
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值