信号通信
1. 概念
互斥:同一时间只能有一个进程或者线程运行
同步:在互斥的基础上有顺序执行
异步:在执行一个程序过程中,打断当前进程执行另一个程序,执行完毕后接着之前的代码继续运行
信号是唯一的一种异步通信机制
信号可以理解为当前系统中定义好的一些标识,每一个标识都有自己特定的含义,并且当进程在执行的时候产生了这个标识,对当前进程会有一定的影响
多个进程就是通过发送信号的方式来实现进程间通信的
2. 信号对进程的默认处理方式
每一个信号产生之后,都会对当前进程有一个默认的处理方式
处理方式 | 含义 |
---|---|
忽略 | 收到该信号后,对当前进程没有影响 |
结束进程 | 收到该信号后,结束当前进程 |
停止进程 | 收到信号后,停止当前进程 |
停止的进程 恢复执行 | 信号产生后,收到该信号的进程会恢复执行(后台执行) |
3. 修改信号对进程的处理方式
修改后的方式 | 含义 |
---|---|
忽略 | 信号产生后,对当前进程无影响 |
缺省(default,默认) | 按照信号的默认处理方式处理 |
捕捉 | 信号产生后,按照自定义方式处理 |
注意
SIGKILL
、SIGSTOP
这两个信号只能以缺省的方式处理,不能忽略也不能捕捉
4. 常用信号及处理方式
kill -l
命令可以查询常用的信号
5. 信号相关函数
5.1 signal()
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
-->
void (*signal(int signum, void (*handler)(int)))(int);
功能:设置信号对进程的处理方式
参数:
signum:信号
handler:处理方式
SIG_IGN 忽略,当信号产生后对当前进程没有任何影响
SIG_DFL 缺省,按照当前信号默认的方式处理
void (*handler)(int sig) 信号处理函数,自定义函数来处理产生信号之后的过程
sig:调用signal时的第一个参数
返回值:
成功:返回修改之前信号对进程的处理方式
失败:SIG_ERR
signal的返回值是一个函数指针,用于保存设置之前的信号的处理方式
5.2 kill() / raise()
#include <sys/types.h>
#include <signal.h>
int kill(