一、信号
信号是操作系统中进程间通信的一种方式,它可以在任一时刻发送给某一进程。如果进程不是处于运行态,那么信号就会由内核保存起来,等到恢复运行后再发送。如果信号被进程设置为阻塞,那么就会一直等到进程对其取消阻塞后传递。
Linux中的信号按不同的值来区分,具体被定义在/usr/includebitssignum.h文件中,在程序里通常只需要include<signal.h>即可。
信号来源:
- 硬件来源:如键盘输入ctrl+c
- 软件来源:使用命令或者系统调用来发送信号。
用户进程对信号有的响应方式:
- 执行信号默认操作,每个信号都有与之对应的默认操作
- 捕捉信号,定义信号处理函数。
- 忽略信号。可以选择忽略信号对当前进程造成的影响

其中有两个信号是不能被忽略和捕捉的,即SIGKILL和SEGSTOP。这样可以方便我们在任何时候结束掉某一进程。
发送信号
在应用程序中,我们可以通过代码来操作信号的发送。例如raise,kill等系统函数。

信号处理
如果我们希望在接收到信号之后进行相应的处理,可以通过signal来注册我们的处理函数,例如:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void sighandler(int);
int main()
{
signal(SIGINT, sighandler);
while(1)
{
printf("开始休眠一秒钟...\n");
sleep(1);
}
return(0);
}
void sighandler(int signum)
{
printf("捕获信号 %d,跳出...\n", signum);
exit(1);
}