什么是信号?
首先,我们通过一个引子去介绍信号。在Linux下编译运行代码,用shell启动一个前台进程,大家都应该有过按Ctrl-C的时候吧,按下Ctrl-C可以强行停止程序继续执行。
其实,这里我们就可以这样说:终端的驱动程序将Ctrl-C理解为一个STGINT信号,记在了该进程的PCB中(也可以说是发送了一个SIGINT信号给进程)。注意:Ctrl-C产生的信号只能发送给前台进程。一个命令后面加&可以放到后台运行,这样shell就可以不用等待进程结束而可以接受新的命令,启动新的进程。
我们写个例子来试验一下:
然后我们去运行:
代码运行之后,我们通过Ctrl-C来停止命令。
当然,我们呢也可以在命令后面加一个&来让进程在后台跑,然后再去捕捉一下:
这里可以看到在后台中有正在运行的./test命令。对了,后面的+号表示在前台运行还是在后台,有+号表示在前台运行,没有表示在后台运行。
如果我们需要删除这个在后台执行的进程,那么我们可以通过kill命令去删除。
首先看一下kill的所有信号:
我们可以通过其中的9号命令去删除掉sig。
我们可以看到这个在后台运行的进程已经被删除了。
信号的产生
上面在简单介绍信号的时候我已经讲了一种信号的产生方式了,那就是Ctrl-C,下面我仔细介绍一下几种方式吧:
①通过终端按键产生信号。
用户在终端键入某些键时引发终端产生信号,比如上面说的Ctrl-C,产生一个SIGINT信号,停止一个进程。Ctrl-\产生SIGQUIT信号,异常终止进程并且CoreDump(在上文中我有介绍)。