D25
本章学习如何实现:
1)健壮的脚本,在被强制终结时具有清除任何临时生成的日志或文件的能力。
2)当脚本收到一个来自用户的中断时,应该采取什么样的行动。
1. Linux中的信号
在Linux或其他类Unix操作系统中,信号被用于进程间的通信。信号是一个发送到某个进程或同一进程中的特定线程的异步通知,用于通知发生的一个事件。现在被定义在POSIX标准中。
当一个事件发生时,会产生一个信号,然后内核会将事件传递到接收的进程。
有时,进程可以发送一个信号到其他进程;
其他:如文件大小达到限额、一个I/O设备就绪或用户发送了Ctrl+C或Ctrl+Z的终端中断等。
运行在用户模式下的进程会接收信号。
如果接收的进程正运行在内核模式,那么信号的执行只有在该进程返回到用户模式时才会开始。
发送到非运行进程的信息一定是内核保存,直到进程重新执行为止。
休眠的进程可以是终端的,也可以是不可中断的。
如果可中断休眠状态的进程收到了一个信号,内核会唤醒这个进程来处理信息。
如果一个不可中断休眠状态的进程收到了一个信号,内核会拖延此信号,直到该事件完成为止。
当进程收到一个信号时,可能发生3种情况:
1)进程可能忽略此信号。有些没有默认行为的信号,默认会被忽略。而有些信号不能被忽略。
2)进程可能会捕获此信号,并执行一个被称为信号处理器的特殊函数。
3)进程可能会执行信号的默认行为,如信号15(SIGTERM)的默认行为是结束进程。
当一个进程执行信号处理时,如果还有其他信号到达,那么新的信号会被阻断知道处理器返回为止。
2. 信号的名称和值
每个信号都以SIG开头命名,并定义为唯一的正整数。使用kill -l可查看所有信号的名称和值。
$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
信号值被定义在/usr/include/bits/signum.h中,其源文件是/user/src/linux/kernel/signal.c。