Ch6 信号和信号处理
知识概要:
- 信号和信号处理;
- 信号和中断的统一处理
- 将信号视为进程中断,将进程从正常执行转移到信号处理
- 信号的来源,包 括来自硬件、异常和其他进程的信号
- 信号在Unix/Linux中的常见用法
- Unix/Linux中的信号处理
- 信号类型
- 信号向量位
- 信号掩码位
- 进程 PROC结构体中的信号处理程序
- 信号处理步骤
6.1 信号和中断
-
中断
:从1/0设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移 到中断处理。 -
信号
:发送给进程的请求,将进程从正常 执行转移到中断处理。
6.2 Unix/Linux信号示例
-
Ctrl+C
组合键会生成一个键盘硬件中断。键盘中断处理程序将Ctrl+C
组合键转换为SIGINT(2)
信 号,发送给终端上的所有进程,并唤醒等待键盘输入的进程。 - 用户可使用
nohup a.out
命令在后台运行一个程序。即使在用户退出后,进程仍将继续运行。nohup
命令会使sh
像往常一样复刻子进程来执行程序,但是子进程会忽略S1GHUP(1)
信号。 - 用户可以使用
sh
命令kill pid
orkill -s 9 pid
杀死该进程。方法如下。-
读者可能会问,为什么是9号信号呢?在最初的Unix中,只有9个 信号。9号信号被保留为终止进程的终极手段。虽然后来的Unix/ Linux系统将信号编号扩 展到了 31,但是信号编号9的含义仍然保留了下来。
-
6.3 Unix/Linux中的信号处理
Unix/Linux支持31种不同的信号,每种信号在signal.h
文件中都有定义。
每种信号都有一个符号名,如SIGHUP(1)
、SIGEMT(2)
、SIGKILL(9)
、S1GSEGV(11)
等。
#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
……
-
来自硬件中断的信号:在进程执行过程中,一些硬件中断被转换为信号发送给进程
- 中断键
Ctrl+C
,它产生一个SIGINT(2)
信号。 - 间隔定时器,当它的时间到期时,会生成一个
SIGALRM(14)
。SIGVTALRM(26)
或SIGPROF(27)
信号。
- 中断键
-
其他硬件错误,如总线错误、IO陷阱等。
- 来自异常的信号:当用户模式下的进程遇到异常时,会陷入内核模式,生成一个信号,并发送给自己。常见的陷阱信号有
SIGFPE(8)
,表示浮点异常(除以0),最常 见也是最可怕的是SIGSEGV(11),表示段错误,等等。 - 来自其他进程的信号:进程可使用
kill(pid, sig)
系统调用向pid标识的目标进程发送信号。
- 来自异常的信号:当用户模式下的进程遇到异常时,会陷入内核模式,生成一个信号,并发送给自己。常见的陷阱信号有
-
实践:
在Linux中运行简单的C程序
main()( while(1>; }
使进程无限循环。从另一个终端,使用
ps-u
查找循环进程pid
。然后 输入sh
命令kill -s 11 pid
-
循环进程会因为段错误而死亡。
-
进程PROC结构体中的信号