信号是进程之间事件异步的一种方式,属于软中断。通俗一点讲就是OS向特定进程通知某件时间发生采用的一种方式。
一个进程在收到信号之前,就已经知道,当接收到信号时应该怎么去做。就好比行人相对于红绿红,在看到红绿灯之前就已经知道红灯停、绿灯行。
Ctrl +c 是通过硬件的输入方式中断进程,它的本质也是通过系统向进程发送信号。
在证明Ctrl c本质之前需要知晓Ctrl c的本质是往前台发送信息,在一次会话中只允许打开一个前台进程。
signal的接口是捕获信号,对信号进行重定义
捕捉到了信号才会触发这个函数
1.Ctrl c只能给前台发送信号给前台进程,一个命令后面加&表示放到后台运行,这样shell不必等待进程结束就可以接收新的命令,启动新进程
当进程被设置为后台进程时,我们在命令行输入的消息流会和后台进程的信息混合在一起,这是因为bash进程是在前台的,我们可以输入信息,但是显示器只有一个,被两个进程同时使用,说明他是临界资源,而这个临界资源又没有被保护,因此它的数据会发生混乱
2.Shell可以同时运行一个前台进程和多个后台进程,只有前台进程才能接收到键盘输入的组合键信号
3.前台进程可以随时接收一个组合键信号,证明了进程相对于信号是异步的
1.忽略信号
2.指向该信号的默认处理动作
3.捕捉信号,类似上面的捕捉2号信号,要求内核在处理该信号时切换到用户状态下执行
信号产生的时候,并不是被立即处理的,信号产生和新处理的中间有一个时间窗口,有一个信号的记录(信号产生,信号保存,信号生命周期结束)
前面已经介绍
kill命令是调用kill函数接口竖向的,kill可以给一个指定的进程发送指定的信号,调用成功返回0,失败返回-1
raise可以给当前进程发送指定的信号(自己给自己发送信号),调用成功返回0,失败-1
这么多信号肯定要有信号不能被捕捉,因为如果都可以被捕捉,病毒可以将所有信号捕捉更改掉,系统就瘫痪了,因此需要一个信号不能被捕捉,即系统始终拥有对进程的终止能力
硬件的异常被检测到,并且通知OS,OS会向当前进程发送适当的信号
1、9号信号不能被捕捉
2、所有的信号都需要经过OS发出,因为发送信号是指挥信号干什么,只有管理者才有这个能力,所以所有信号的发出需要经过OS
3、上面介绍的是,信号的触发条件
4、如何表示收到信号:在进程的PCB中保存一张位图,1表示收到信号,0表示没有收到
5、如何表示发送信号:OS发信号只需在PCB中找到位图,将对应的比特位改为1