Linux signal小结

发布时间:2024年01月19日

1、信号列表

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

首先列出的是POSIX.1中列出的信号:

SIGHUP 1 A 终端挂起或者控制进程终止?
SIGINT 2 A 键盘中断(如ctrl+c键被按下)?
SIGQUIT 3 C 键盘的退出键被按下?
SIGILL 4 C 非法指令?
SIGABRT 6 C 由abort(3)发出的退出指令?
SIGFPE 8 C 浮点异常?
SIGKILL 9 AEF Kill信号?
SIGSEGV 11 C 无效的内存引用?
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道?
SIGALRM 14 A 由alarm(2)发出的信号?
SIGTERM 15 A 终止信号 ,kill或killall通知程序
SIGUSR1 30,10,16 A 用户自定义信号1?
SIGUSR2 31,12,17 A 用户自定义信号2?
SIGCHLD 20,17,18 B 子进程结束信号?
SIGCONT 19,18,25 进程继续(曾被停止的进程)?
SIGSTOP 17,19,23 DEF 终止进程?
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键?
SIGTTIN 21,21,26 D 后台进程企图从控制终端读?
SIGTTOU 22,22,27 D 后台进程企图从控制终端写?

下面的信号没在POSIX.1中列出,而在SUSv2列出

SIGBUS 10,7,10 C 总线错误(错误的内存访问)?
SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义?
SIGPROF 27,27,29 A Profiling定时器到?
SIGSYS 12,-,12 C 无效的系统调用 (SVID)?
SIGTRAP 5 C 跟踪/断点捕获?
SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD)?
SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD)?
SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD)?
SIGXFSZ 25,25,31 C 超出设定的文件大小限制(4.2 BSD)?

(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))

下面是其它的一些信号?

SIGIOT 6 C IO捕获指令,与SIGABRT同义?
SIGEMT 7,-,7?
SIGSTKFLT -,16,- A 协处理器堆栈错误?
SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD)?
SIGCLD -,-,18 A 与SIGCHLD同义?
SIGPWR 29,30,19 A 电源故障(System V)?
SIGINFO 29,-,- A 与SIGPWR同义?
SIGLOST -,-,- A 文件锁丢失?
SIGWINCH 28,28,20 B 窗口大小改变(4.3 BSD, Sun)?
SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS)?

(在这里,- 表示信号没有实现;有三个值给出的含义为,第一个值通常在Alpha和Sparc上有效,中间的值对应i386和ppc以及sh,最后一个值对应mips。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。)?

处理动作一项中的字母含义如下?
A 缺省的动作是终止进程?
B 缺省的动作是忽略此信号?
C 缺省的动作是终止进程并进行内核映像转储(dump core)?
D 缺省的动作是停止进程?
E 信号不能被捕获?
F 信号不能被忽略?

2、signal库函数
signal库函数可以设置程序对信号的处理方式。
包含头文件:
#include <signal.h>
函数声明
sighandler t signal(int signum, sighandler t handler),
参数signum表示信号的编号
参数handler表示信号的处理方式,有三种情况
1)SIG IGN:忽略参数signum所指的信号,
2)一个自定义的处理信号的函数,信号的编号为这个自定义函数的参数。
3)SIG DFL:恢复参数signum所指信号的处理方法为默认值。
程序员不关心signal的返回值。

3、Signal信号的含义

SignalDescription
SIGABRT-6由调用abort函数产生,进程非正常退出
SIGALRM-14用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS-7某种特定的硬件异常,通常由内存访问引起
SIGCANCEL由Solaris Thread Library内部使用,通常不会使用
SIGCHLD-17进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT-18当被stop的进程恢复运行的时候,自动发送
SIGEMT和实现相关的硬件异常
SIGFPE-8数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZESolaris专用,Hiberate或者Suspended时候发送
SIGHUP-1

发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送

终端挂起或者控制进程终止

SIGILL-4非法指令异常
SIGINFOBSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT-2由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO-29异步IO事件
SIGIOT实现相关的硬件异常,一般对应SIGABRT
SIGKILL-9无法处理和忽略。中止某个进程
SIGLWP由Solaris Thread Libray内部使用
SIGPIPE-13在reader中止之后写Pipe的时候发送
SIGPOLL当某个事件发送给Pollable Device的时候发送
SIGPROF-27Setitimer指定的Profiling Interval Timer所产生
SIGPWR-30和系统相关。和UPS相关。
SIGQUIT-3输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
SIGSEGV-11非法内存访问
SIGSTKFLT-16Linux专用,数学协处理器的栈异常
SIGSTOP-19中止进程。无法处理和忽略。
SIGSYS-31非法系统调用
SIGTERM-15请求中止进程,kill命令缺省发送
SIGTHAWSolaris专用,从Suspend恢复时候发送
SIGTRAP-5实现相关的硬件异常。一般是调试异常
SIGTSTP-20Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
SIGTTIN-21当Background Group的进程尝试读取Terminal的时候发送
SIGTTOU-22当Background Group的进程尝试写Terminal的时候发送
SIGURG-23当out-of-band data接收的时候可能发送
SIGUSR1-10用户自定义signal 1
SIGUSR2-12用户自定义signal 2
SIGVTALRM-26setitimer函数设置的Virtual Interval Timer超时的时候
SIGWAITINGSolaris Thread Library内部实现专用
SIGWINCH-28当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
SIGXCPU-24当CPU时间限制超时的时候
SIGXFSZ-25进程超过文件大小限制
SIGXRESSolaris专用,进程超过资源限制的时候发送
文章来源:https://blog.csdn.net/wteruiycbqqvwt/article/details/135703621
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。