26 信号
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) 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
man 7 signal
查看信号详情
信号处理类别
信号产生后用户进程对信号的处理方式:
- 执行默认操作
- 捕捉信号
- 忽略信号
信号处理流程
通过 API 注册一个信号处理函数:
- 在用户程序里面,有两个函数可以调用,一个是 signal,一个是 sigaction,推荐使用 sigaction。
- 用户程序调用的是 Glibc 里面的函数,signal 调用的是 **sysv_signal,里面默认设置了一些参数,使得 signal 的功能受到了限制,sigaction 调用的是 **sigaction,参数用户可以任意设定。
- 无论是 **sysv_signal 还是 **sigaction,调用的都是统一的一个系统调用 rt_sigaction。
- 在内核中,rt_sigaction 调用的是 do_sigaction 设置信号处理函数。在每一个进程的 task_struct 里面,都有一个 sighand 指向 struct sighand_struct,里面是一个数组,下标是信号,里面的内容是信号处理函数。
信号的发送
硬件触发的,无论是中断,还是信号,先到内核,然后内核对于中断和信号处理方式不同。
一种完全在内核里面处理完毕,另一种是将信号放在对应的进程 task_struct 里信号相关的数据结构里面,然后等待进程在用户态去处理。
信号的处理
在从系统调用或者中断返回时调用 exit_to_usermode_loop。