操作系统(linux)中信号工作的原理分析

信号

首先我们先理解一下信号是什么?在linux下我们先看看都有那些信号,
我们输入kill -l 就会出现
信号表
这就是信号的全部种类,总共有62种信号,其中1到31是普通信号,也是这篇主要理解的,后面34到64的信号为实时信号。

信号是干什么的呢?
我们举个例子:
最简单的理解,在linux下我们在运行某个进程的时候,通常在shell下启动一个前台进程,但是我们进程运行过程中我们,按下Ctrl+c,这个时候我们的进程就会停止或者说结束。其实,这就是信号起了作用,在我们按下Ctrl+c的时候,将会产生硬件中断,从而cpu转到内核去处理中处理,同时终端会将Ctrl+c被解析成一个SIGINT信号,发送给进程PBC,这个时候PCB中的会被记录下一个SIGINT信号,当某个时候cup从内核切回到用户空间时候,所以会处理这个进行中记录的信号,而这个信号的默认处理动作是结束进程。

信号的产生

关于信号的产生有三种情况:
1)键盘按键产生信号
键盘按键产生信号很好理解,比如我按的 Ctrl+c 产生信号SIGINT,按下Ctrl+z 产生SIGSTP 信号,Ctrl+\ 产生SIGOUT信号。这里要说一一下Ctrl+\ 这个产生信号,将程序终止掉后会产生core dump文件。

core dump文件干什么用的?core dump 是在程序运行过程中收到信号,或者在程序异常终止后,系统会把程序在内核中程序终止时候的信息保存到core dump文件中。我们可以用ulimit -c 来进行对core dump文件大小进行调整。在不修改的前提下默认的core dump文件的大小为0。
core dump文件
2)调用系统函数
调用系统函数向进程发送信号,我们看看系统调用函数。

#include <signal.h>
int kill(pid_t pid, int signo);
int raise(int signo);

上面的两个函数,我们来解释一下,
kill函数两个参数,pid为给哪个进程要发信号,signo为哪中信号。
raise函数其实是kill函数的封装,raise函数是自己给自己发送任意信号。
上面两个函数都是成功返回1,失败返回0。

还有个函数,是c语言中的函数

#include <stdlib.h>
void abort(void);

abort函数是给自己发送abort信号。就像exit函数一样,但是abort总会成功。

3)软件产生信号
如果了解进程间的通信,我们就会知道有个匿名管道,如果我们在打开管道,如果打开写端关闭读端,系统会自动的发送一个SIGPIPE信号,关闭管道。

信号的阻塞

信号阻塞我们就需要了解信号在PCB中是怎么样的一种方式来表示它的信号。
在进程中当一个进程收到一个信号的时候,信号其实是先到该进程中的PCB中找到一个表,我们就叫未决信号表,其实是二进制表示的位图,先将 sigset_t 动作叫做信号递达。

我们用张图来理解:
进程中信号阻塞表
我们要注意

进程可以选择阻塞某个信号
如果在信号未决后,我们设置了阻塞,那么该信号会在未决表中等待解除阻塞
在信号中我们要明白,信号的阻塞和忽略不同,忽略是信号的处理方式,而阻塞只是信号在传递过程中,对信号的一种延后处理的行为。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值