1、常见的信号
信号(signal)是很短的信息,可以被发送到一个进程或一组进程,发送给进程的唯一信息通常是一个数,以此来表示信号。
信号的两个主要目的:让进程知道已经发生了一个特定的事件;强迫进程执行它自己代码中的信号处理程序。
$ 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
信号1~31是
不可靠信号(非实时的),POSIX标准中还引入了一类新的信号,叫做
可靠信号(
实时信号)(32~64)。
不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。如果一个不可靠信号被连续发送多次,那么只有其中的一个发送到接收进程。
2
|
SIGINT
|
terminate
|
来自键盘的中断(通常是Ctrl+c)
|
9
|
SIGKILL
|
terminate
|
强迫进程终止(kill -9)
|
15
|
SIGTERM
|
terminate
|
进程终止(不带参数时kill默认发送的信号)
|
19
|
SIGSTOP
|
stop
|
停止进程执行
|
18
|
SIGCONT
|
continue
|
如果进程已停止则恢复执行
|
11
|
SIGSEGV
|
dump
|
无效的内存引用
|
14
|
SIGALRM
|
terminate
|
实时定时器时钟
|
20
|
SIGTSTP
|
stop
|
从tty发出停止进程(Ctrl+z)
|
SIGSEGV:segmentFault,试图访问未分配给自己的内存,或试图往没有写权限的内存地址写数据。
(1)buffer overflow:usually caused by a pointer reference out of range。野指针
(2)stack overflow:please keep in mind that the default stack size is 8192K(4M)。栈溢出
(3)illegal file access:file operations are forbidden on our judge system。非法文件访问
2、进程对一个信号的应答
进程以三种方式对一个信号做出应答:
(1)显示地忽略信号
(2)执行与信号相关的缺省操作。内核预定义的缺省操作取决于信号的类型,有以下几种:
terminate:进程被终止(杀死)
dump:进程被终止(杀死)并且如果可能,创建包含进程执行上下文的核心转储文件,core dump文件。
ignore:信号被忽略
stop:进程被停止,把进程置为TASK_STOPPED状态
continue:如果进程被停止(TASK_STOPPED ),就把它置为TASK_RUNNING状态
(3)通过调用相应的信号处理函数捕获信号