本章讲述了信号和信号处理;介绍了信号和中断的统一处理,有助于从正确的角度看待信号;将信号视为进程中断, 将进程从正常执行转移到信号处理;解释了信号的来源,包括来自硬件、异常和其他进程的信号;然后举例说明了信号在Unix/Linux 中的常见用法;详细解释了 Unix/Linux 中的信号处理,包括信号类型、信号向景位、信号掩码位、进程 PROC 结构体中的信号处理程序以及信号处理步骤。
信号和中断
"中断” 是从 I/O 设备或协处理器发送到 CPU 的外部请求,它将 CPU 从正常执行转移到中断处理。与发送给 CPU 的中断请求一样,“信号” 是发送给进程的请求,将进程从正常执行转移到中断处理。
Unix/Linux 信号示例
按 "Ctrl+C" 组合键通常会导致当前运行的进程终止。 原因如下。 "Ctrl+C" 组合键会生成一个键盘硬件中断。 键盘中断处理程序将 "Ctrl+C'' 组合键转换为 SIGINT (2)信 号, 发送给终端上的所有进程, 并唤醒等待键盘输人的进程。 在内核模式F. 每个进程都要检查和处理未完成的信号3 进程对大多数信号的默认操作是凋用内核的 kexit(exitValue) 函数来终止亡 在 Linux 中, exitValue 的低位字节是导致进程终止的信号编号。
Unix/Linux 中的信号处理
Unix/Linux 支待31种不同的信号, 每种信号在 signal.h 文件中都有定义。
#define SIGHUP #define SIGINT #define SIGQUIT #define SIGILL #define SIGTRAP #define SIGABRT #define SIGIOT #define SIGBUS #define SIGFPE #define SIGKILL #define SIGUSRl #define SIGSEGV #define SIGUSR2 #define SIGPIPE #define SIGALRM #define SIGTERM #define SIGSTKFLT #define SIGCHLD #define SIGCONT #define SIGSTOP #define SIGTSTP #define SIGTTIN #define SIGTTOU #define SIGURG #define SIGXCPU #define SIGXFSZ #define SIGVTALRM #define SIGPROF #define SIGWINCH #define SIGPOLL #define SIGPWR #define SIGSYS
信号的来源
来自硬件中断的信号:在进程执行过程中, 一些硬件中断被转换为信号发送给进程。
来自异常的信号: 当用户模式下的进程遇到异常时, 会陷入内核模式, 生成一个信号, 并发送给自己。 常见的陷阱信号有SIGFPE (8), 表示浮点异常(除以 0), 最常 见也是最可怕的是SIGSEGV (11), 表示段错误, 等等。
来自其他进程的信号:进程可使用kill(pid, sig)系统调用向pid标识的目标进程发送信号。
进程PROC 结构体中的信号
每个进程PROC 都有一个32位向量,用来记录发送给进程的信号。在位向量中,每一
位 (0 位除外)代表一个信号编号。此外它还有一个信号MASK位向盘,用来屏蔽相应的信号。
信号处理函数
每个进程PROC都有一个信号处理数组intsig[32]o sig[32]数组的每个条目都指定了如何处理相应的信号,其中0表示DEFault(默认),1表示IGNore(忽略),其他非零值表示用户模式下预先安装的信号捕捉(处理)函数。
安装信号捕捉函数
信号处理步骤
信号与异常
Unix信号最初设计用于以下用途。