信号的编号
可以使用kill -l 命令查看当前系统可使用的信号有哪些
$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
不存在编号为0的信号。其中 1-31号信号称之为常规信号(也叫普通信号),
34-64之间的信号称之为实时信号,驱动编程于硬件相关。名字上区别不大,
而前面32个名字各不相同。
常规信号和实时信号的区别:
所有的常规信号都有它所对应的默认事件和处理动作。
而实时信号它没有默认事件
实时信号也不在应用开发程序中使用。
一般是在驱动底层开发的时候会用到。
我们现在只需要掌握前面的常规信号即可。
常规信号需要结合信号四要素去了解它们。
信号四要素
好比变量三要素
1.变量类型
2.变量名
3.变量值
信号使用之前,先确定信号四要素之后,再用
信号四要素:
1.编号
2.名称
3.信号对应的事件 (容易忽略)
4.默认处理动作 (容易忽略,内核处理)
可通过man 7 signal查看帮助文档
SIGNAL(7) Linux Programmer's Manual SIGNAL(7)
NAME
signal - overview of signals
DESCRIPTION
Linux supports both POSIX reliable signals (hereinafter "standard sig‐
nals") and POSIX real-time signals.
Signal dispositions
Each signal has a current disposition, which determines how the process
behaves when it is delivered the signal.
The entries in the "Action" column of the tables below specify the
default disposition for each signal, as follows:
Term Default action is to terminate the process.
Ign Default action is to ignore the signal.
Core Default action is to terminate the process and dump core (see
core(5)).
Manual page signal(7) line 1 (press h for help or q to quit)
First the signals described in the original POSIX.1-1990 standard.
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at terminal
SIGTTIN 21,21,26 Stop Terminal input for background process
SIGTTOU 22,22,27 Stop Terminal output for background process
The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
Next the signals not in the POSIX.1-1990 standard but described in
SUSv2 and POSIX.1-2001.
Signal Value Action Comment
────────────────────────────────────────────────────────────────────
SIGBUS 10,7,10 Core Bus error (bad memory access)
SIGPOLL Term Pollable event (Sys V).
Synonym for SIGIO
SIGPROF 27,27,29 Term Profiling timer expired
SIGSYS 12,31,12 Core Bad argument to routine (SVr4)
SIGTRAP 5 Core Trace/breakpoint trap
SIGURG 16,23,21 Ign Urgent condition on socket (4.2BSD)
SIGVTALRM 26,26,28 Term Virtual alarm clock (4.2BSD)
SIGXCPU 24,24,30 Core CPU time limit exceeded (4.2BSD)
SIGXFSZ 25,25,31 Core File size limit exceeded (4.2BSD)
Up to and including Linux 2.2, the default behavior for SIGSYS, SIGX‐
CPU, SIGXFSZ, and (on architectures other than SPARC and MIPS) SIGBUS
was to terminate the process (without a core dump). (On some other
UNIX systems the default action for SIGXCPU and SIGXFSZ is to terminate
the process without a core dump.) Linux 2.4 conforms to the
POSIX.1-2001 requirements for these signals, terminating the process
with a core dump.
Next various other signals.
Signal Value Action Comment
────────────────────────────────────────────────────────────────────
SIGIOT 6 Core IOT trap. A synonym for SIGABRT
SIGEMT 7,-,7 Term
SIGSTKFLT -,16,- Term Stack fault on coprocessor (unused)
SIGIO 23,29,22 Term I/O now possible (4.2BSD)
SIGCLD -,-,18 Ign A synonym for SIGCHLD
SIGPWR 29,30,19 Term Power failure (System V)
SIGINFO 29,-,- A synonym for SIGPWR
SIGLOST -,-,- Term File lock lost (unused)
SIGWINCH 28,28,20 Ign Window resize signal (4.3BSD, Sun)
SIGUNUSED -,31,- Core Synonymous with SIGSYS
(Signal 29 is SIGINFO / SIGPWR on an alpha but SIGLOST on a sparc.)
SIGEMT is not specified in POSIX.1-2001, but nevertheless appears on
most other UNIX systems, where its default action is typically to ter‐
minate the process with a core dump.
SIGPWR (which is not specified in POSIX.1-2001) is typically ignored by
default on those other UNIX systems where it appears.
SIGIO (which is not specified in POSIX.1-2001) is ignored by default on
several other UNIX systems.
Where defined, SIGUNUSED is synonymous with SIGSYS on most architec‐
tures.
为什么出现下面的情况:
SIGUSR1 30,10,16 Term User-defined signal 1
(Where three values are given, the first one is usually valid for alpha
and sparc, the middle one for x86, arm, and most other architectures,
and the last one for mips. (Values for parisc are not shown; see the
Linux kernel source for signal numbering on that architecture.) A -
denotes that a signal is absent on the corresponding architecture.)
分不同的操作系统,值是不一样的
第一个是 alpha and sparc
(alpha :摩托摩拉公司 贝尔实验室 苹果公司 共同开发出来的,被收购后在苹果旗下)
(sparc:SUN和TI公司)
第二个是 x86 arm 或者其他的架构
第三个是 mips 芯片
不同的操作系统,值是不一样的,但是名字是一样的。
所以写的时候,推荐使用名字去写。
Linux常规信号一览表
1)SIGHUP:本信号在用户终端结束时发出,通常是在终端的控制进程结束时,通知同一会话期内的各个作业,这时他们与控制终端不在关联。
比如,登录Linux时,系统会自动分配给登录用户一个控制终端,在这个终端运行的所有程序,
包括前台和后台进程组,一般都属于同一个会话。当用户退出时,所有进程组都将收到该信号,
这个信号的默认操作是终止进程。此外对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
简短描述:
当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作是终止进程
比如由终端启动起来的进程,统一发送SIGHUP信号
PS: 进入shell的两种方式:A.进入Linux控制台 B.使用终端
SIGHUP: Signal Hang Up (信号:挂机)
2)SIGINT:程序终止信号。当用户按下CRTL+C时通知前台进程组终止进程。
补充:
默认动作也是终止进程
Signal: Interruption
3)SIGQUIT:Ctrl+\控制,进程收到该信号退出时会产生core文件,类似于程序错误信号。
补充:
用户终端向正在运行的由该终端启动的程序发出信号,默认动作是终止进程
4)SIGILL: 执行了非法指令。通常是因为可执行文件本身出现错误,或者数据段、堆栈溢出时也有可能产生这个信号。
补充:
CPU检测到某些进程执行了非法指令。默认动作为终止进程 产生 core 文件。应用程序当中应用的概率很小。
5)SIGTRAP:由断点指令或其他陷进指令产生,由调试器使用。
补充:
该信号由断点指令或其他trap指令产生。默认动作为终止进程 并产生core文件
是gdb调试的时候,会产生的信号
6)SIGABRT:调用abort函数产生,将会使程序非正常结束。
补充:
默认动作为终止进程并产生core 文件。
7)SIGBUS: 非法地址。包括内存地址对齐出错。比如访问一个4个字长的整数,但其地址不是4的倍数。
它与SIGSEGV的区别在于后者是由于对合法地址的非法访问触发。
8)SIGFPE: 发生致命的算术运算错误。
补充:
浮点数例外的错误,除0操作及溢出等所有的算法错误。
默认动作为终止进程并产生core文件。
SIGnal: Floating Point Exception”的缩写,意思是“信号:浮点异常”
9)SIGKILL:用来立即结束程序的运行。 (重点)
补充:
无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。
它向系统管理员提供了可以杀死任何进程的方法。该信号,不能够被忽略。
不能够被捕捉,只能够执行执行默认动作。
10)SIGUSR1:留给用户使用,用户可自定义。
补充:
用户定义的信号,即程序员可以在程序中,定义并使用该信号。默认动作是终止进程
11)SIGSEGV:访问未分配给用户的内存区。或操作没有权限的区域。
补充:
是段错误信号,提示进程进行无效内存访问。默认动作为终止进程并产生core文件(会把终止的原因写进core文件中去)。
“SIGSEGV”是“SIGnal: SEGmentation Violation
12)SIGUSR2:留给用户使用,用户可自定义。
补充:
用户定义的信号,即程序员可以在程序中,定义并使用该信号。默认动作是终止进程
13)SIGPIPE:管道破裂信号。当对一个读进程已经运行结束的管道执行写操作时产生。
补充:
broken pipe向一个没有读端的管道写数据。默认动作为终止信号。
14)SIGALRM:时钟定时信号。由alarm函数设定的时间终止时产生。
补充:
定时器超时,超时的时间 由系统调用alarm设置。默认动作是终止信号。
15)SIGTERM:程序结束信号。shell使用kill产生该信号,当结束不了该进程,尝试使用SIGKILL信号。
补充:
程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来表示程序正常退出。
执行shell命令kill时,缺省产生这个信号。默认动作为终止信号。
16)SIGSTKFLT:堆栈错误。
补充:
Linux早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程。
SIGnal:STack Fault
17)SIGCHLD:子进程结束,父进程会收到。如果子进程结束时父进程不等待或不处理该信号,子进程会变成僵尸进程。
补充:
子进程状态发生变化,父进程会收到这个信号。默认动作为忽略这个信号。报信的人是内核。
18)SIGCONT:让一个停止的进程继续执行。
补充:
如果进程已经停止,则使其继续运行。默认动作为继续/忽略
19)SIGSTOP:暂停进程执行。暂停执行。
补充:
也是不能被忽略,处理和阻塞,只能执行默认动作,默认动作为暂停进程。
20)SIGTSTP:停止运行,可以被忽略。Ctrl+z。
补充:
默认动作为暂停进程。
后面的就相对没那么重要了。
21)SIGTTIN:当后台进程需要从终端接收数据时,所有进程会收到该信号,暂停执行。
补充:
默认动作是暂停进程
SIGnal: TTY INput”的缩写
22)SIGTTOU:与SIGTTIN类似,但在写终端时产生。
补充:
默认动作是暂停进程
23)SIGURG:套接字上出现紧急情况时产生。
补充:
套接字上由紧急数据时,向当前正在进行的进程发出信号,报告有紧急数据到达。
如网络带外数据到达,默认动作为忽略该信号。
24)SIGXCPU:超过CPU时间资源限制时产生的信号。
补充:
进程执行时间超过了分配给该进程的CPU时间,系统产生该信号并发送给该进程。
默认动作为忽略该信号。
25)SIGXFSZ:当进程企图扩大文件以至于超过文件大小资源限制时产生。
补充:
超过文件的最大长度设置。默认动作为终止信号。
26)SIGVTALRM:虚拟使用信号。计算的是进程占用CPU调用的时间。
补充:
虚拟时钟超时时,产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。
默认动作为终止进程。
27)SIGPROF:包括进程使用CPU的时间以及系统调用的时间。
补充:
默认动作是终止进程。
28)SIGWINCH:窗口大小改变时。
补充:
默认为忽略该进程。
29)SIGIO:文件描述符准备就绪,表示可以进行输入输出操作。
补充:
此信号向进程指示发出了一个异步IO事件。默认动作为忽略。
30)SIGPWR:电源失效信号。
补充:
关机。默认动作为终止进程
31)SIGSYS:非法的系统调用。
补充:
无效的系统调用。默认动作为终止进程并产生core文件。
34)SIGRTMIN -64)SIGRTMAX:
Linux的实时信号,他们没有固定的含义(可以由用户自定义)。
所有的实时信号的默认动作都为终止信号
A.操作系统给自己留的唯一的有效的终止进程的方法
SIGKILL 终止进程
SIGSTOP 暂停进程
这两个信号比较特殊:
都是不能被忽略、捕捉,只能执行默认动作(特别强调,重点种的重点)
B.SIGUSR1 和 SIGUSR2 也比较特殊,特殊在于只有这两个信号
没有默认事件,可以由程序员自己定义事件。
C.SIGTERM 信号要了解
D. SIGCHLD 默认动作是忽略,常用的十来个信号中,唯一一个是默认动作是忽略的信号。
常用的:SIGHUP SIGINT SIGQUIT SIGBUS SIGFPE SIGKILL SIGUSR1 SIGSEGV SIGUSR2
SIGPIPE SIGALRM SIGTERM SIGCHLD
PS:
信号的处理动作:
1.执行默认动作
有五种:
Term:终止进程
Ign: 忽略信号(不要和信号的处理动作混了)
Core:终止进程,生成core文件(查验进程的死亡原因就,用于gdb调试)
stop:停止(暂停)进程ID
cont:继续运行进程
2.忽略
3.捕捉
另外需要清楚的是,只有每个信号所对应的事件发生了,该信号才会被
递送(但不一定递达),不应乱发信号!!!!
阻塞的时候,就不能递达。
PS:
信号所处状态
1)递达:递送并且到达进程。注意一定是到达了进程(实际是内核)。
2)未决:产生和递达之间的状态,更详细的描述应该是有可能发生但未发生的事情。主要由于阻塞(屏蔽)导致该状态。
3)非未决:不可能发生的事情。