进程间通信之信号
信号
信号是在软件层次上 是⼀种通知机制, 对中断机制的⼀种模拟,是⼀种异步通信⽅式, ⼀般具有
如下特点:
1. 进程在运⾏过程中,随时可能被各种信号打断
2. 进程可以忽略, 或者去调⽤相应的函数去处理信号
3.进程⽆法预测到达的精准时间
在 Linux 中信号⼀般的来源如下
程序执⾏错误,如内存访问越界,数学运算除 0
由其他进程发送
通过控制终端发送 如 ctrl + c
⼦进程结束时向⽗进程发送的 SIGCLD 信号
程序中设定的定时器产⽣的 SIGALRM 信号
信号的种类
在 Linux 系统可以通过 kill -l 命令查看, 常⽤的信号列举如下
-
SIGINT 该信号在⽤户键⼊ INTR 字符 (通常是 Ctrl-C) 时发出,终端驱动程序发送此
信号并送到前台进>程中的每⼀个进程。 -
SIGQUIT 该信号和 SIGINT 类似,但由 QUIT 字符 (通常是 Ctrl-) 来控制。
-
SIGILL 该信号在⼀个进程企图执⾏⼀条⾮法指令时 (可执⾏⽂件本身出现错误,或者
试图执⾏数据段、堆栈溢出时) 发出。 -
SIGFPE 该信号在发⽣致命的算术运算错误时发出。这⾥不仅包括浮点运算错误,还
包括溢出及除数 > 为 0 等其它所有的算术的错误。 -
SIGKILL 该信号⽤来⽴即结束程序的运⾏,并且不能被阻塞、处理和忽略。
-
SIGALRM 该信号当⼀个定时器到时的时候发出。
-
SIGSTOP 该信号⽤于暂停⼀个进程,且不能被阻塞、处理或忽略。
-
SIGTSTP 该信号⽤于交互停⽌进程,⽤户可键⼊ SUSP 字符时 (通常是 Ctrl-Z) 发出
这个信号。 -
SIGCHLD ⼦进程改变状态时,⽗进程会收到这个信号
-
SIGABRT 进程异常中⽌
信号在操作系统中的定义如下:
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10 // 用户自定义信号
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT