信号的概念
生活中遇到红绿灯,我们知道红灯停绿灯行;跑到比赛的枪响了我们知道要开始跑了,这些在我们生活中存在的各种信号在操作系统当中也会有类似的机制,接下来我将分成三个大块来介绍进程间的信号。
(编号为1-31的为不可靠信号,34-64的为可靠信号。连续不间断发送信号,信号会丢失的为不可靠信号,连续不间断发送信号,信号不会丢失的为可靠信号。)
第一块:信号产生前
机器是人生产的,所以就会让机器实现和人类相同的处理问题的机制,比如我们为什么遇到了红灯就知道要停下来,这是因为我们一开始是通过接受教育获得知识才懂得了红绿灯的规则,(OS)操作系统同样,一开始会由程序员在为OS编写好了遇到各种信号的处理时机与处理方法,是所以在我们使用当中遇到各种问题操作系统会接收到信号并反馈给我们。
因此,进程是具有识别信号处理信号的能力,这是远远早于信号产生的。
但如果信号产生了,进程就必须立刻处理吗?比如说早上我们的闹钟响了,我们一定要立刻起床吗?不一定对吗,进程也会有将信号储存起来的功能,到合适的时机再进行处理。
收到的信号保存在进程的控制块(PCB)当中。信号的本质也是数据,信号的发送>>>>往进程的PCB中写入信号的数据
信号产生的方式
一共有四种,我们分别简单介绍下:
1.键盘产生
2.进程异常,产生信号
3.通过系统调用,产生信号
4.软件条件,产生信号
本质上所有的信号最后都是经过OS向目标进程发出来的
1.键盘产生
最常见的就是我们写一个死循环的函数,那么当我们想结束循环,我们可以键盘输入ctrl+c,强行结束该进程。
这里我们键盘的输入本质上就是就是我们向OS发送了要强行结束的信号,通过OS控制进程结束了循环。
2.进程异常,产生信号
简单来说,当我们写了一行错误的代码,我们运行后OS会提示我们哪一行有问题,这就是因为我们的进程出现了异常被OS识别到,然后OS发信号干掉我们的进程。
3.通过系统调用,产生信号
常见的就是我们的写的代码在执行过程中调用了比如kill的命令,kill功能简单来说就是向OS发送信号处理想要的进程。
4.软件条件,产生信号
include <unistd.h>
unsigned int alarm(unsigned int seconds);
调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。
补充:如何获取子进程退出的信号
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <string.h>
#<