10.1Linux常见信号处理
10.1.1信号与中断
Linux信号是一种进程间异步通信机制,在实现上是一种软中断。信号可以导致一个正在运行的进程被异步打断,转而处理一个突发事件。
Linux在/usr/include/asm/signal.h中详细的定义了信号的信号值。
➜ _10_SIGNALS cat /usr/include/asm/signal.h
。。。
#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 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
/*
#define SIGLOST 29
*/
#define SIGPWR 30
#define SIGSYS 31
#define SIGUNUSED 31
。。。
SIGCHLD:子进程退出时会给父进程发送该信号,父进程可以根据该信号来完成对子进程的PCB资源的回收。
SIGSTOP和SIGKILL不能被屏蔽、安装。用户不能自定义这两个信号的处理。
SIGSTOP和SIGCONT是配对的。一个进程在收到SIGSTOP后会暂停执行,进入暂停状态,并屏蔽除SIGKILL所有的信号。当该进程收到SIGCONT信号后会继续执行。
信号可以唤醒被中断的进程,例如,可以唤醒调用sleep函数进入阻塞状态的进程。
10.1.2信号的基本概念
发送信号:产生信号,有多种发送信号的方式。一个进程可以向另一个进程发送一个特定信号;内核可以向用户进程发送信号,一个进程还可以给自己发送信号。
安装信号:设置信号到来时不再执行默认操作,而是执行自定义代码,即期望某个信号到来时让进程执行相应的中断服务程序。
递送信号:一个信号被操作系统发送到目标进程。
捕获信号:被递送的信号在目标进程引起某段处理程序的执行。
屏蔽信号:进程告诉系统暂时不接收某些信号。如果进程该信号的屏蔽,该信号将被捕获到。
忽略信号:信号被递送到目标进程,但目标进程不处理,直接丢弃。
未决信号:信号已经产生,但因目标进程暂时屏蔽该信号而不能被目标进程捕获的信号。
可靠信号与不可靠信号:编号小于32的信号为不可靠信号,大于32的信号为可靠信号。如果进程在屏蔽某个信号的时间内,其他进程多次向其发送同一个信