Linux中的信号详解

Linux 信号列表及详解:

$ 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     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 的信号为传统 UNIX 支持的信号,属于 不可靠信号(非实时信号)。
  • 编号为 32 ~ 63 的信号是后来扩展的,称作 可靠信号(实时信号)。不可靠信号和可靠信号的区别在于,前者不支持排队,可能会导致信号丢失,而后者则不会。

信号详解

1) SIGHUP

  • 描述:本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一 session 内的各个作业,这时它们与控制终端不再关联。
  • 应用:常用于守护进程重新读取配置文件,或者让某些进程忽略它继续运行。

2) SIGINT

  • 描述:程序终止(interrupt)信号,通常是用户键入 Ctrl-C 时发出,用于通知前台进程组终止进程。

3) SIGQUIT

  • 描述:与 SIGINT 类似,但由 Ctrl-/ 触发。进程在收到 SIGQUIT 后会生成 core 文件,通常用于调试。

4) SIGILL

  • 描述:执行非法指令。通常是由于可执行文件本身出现错误,或者试图执行数据段。

5) SIGTRAP

  • 描述:由断点指令或其他 trap 指令产生,通常用于调试器。

6) SIGABRT

  • 描述:调用 abort() 函数生成的信号,通常用于进程内部的异常处理。

7) SIGBUS

  • 描述:非法内存地址,通常是内存对齐错误。例如,试图访问一个四字节整数,但其地址不是 4 的倍数。

8) SIGFPE

  • 描述:发生致命的算术运算错误时发出。包括浮点运算错误、溢出及除数为 0 等其他算术错误。

9) SIGKILL

  • 描述:用来立即结束程序的运行。该信号不能被阻塞、处理或忽略,是一种强制终止信号。

10) SIGUSR1

  • 描述:留给用户自定义用途。

11) SIGSEGV

  • 描述:试图访问未分配给自己的内存,或者试图往没有写权限的内存地址写数据。

12) SIGUSR2

  • 描述:留给用户自定义用途。

13) SIGPIPE

  • 描述:管道破裂。当一个进程向已关闭的管道写数据时,会触发此信号。

14) SIGALRM

  • 描述:时钟定时信号。通常由 alarm() 函数使用。

15) SIGTERM

  • 描述:程序结束信号。与 SIGKILL 不同,SIGTERM 可以被捕获和阻塞,允许进程自行处理退出。

17) SIGCHLD

  • 描述:当子进程结束时,父进程会收到此信号。如果父进程没有处理这个信号,子进程会成为僵尸进程。

18) SIGCONT

  • 描述:让一个停止的进程继续执行。无法被阻塞。

19) SIGSTOP

  • 描述:停止进程的执行。与 SIGINT 和 SIGTERM 不同,进程只是暂停执行,不能被阻塞。

20) SIGTSTP

  • 描述:停止进程的运行,但该信号可以被处理或忽略。通常通过 Ctrl-Z 发出。

21) SIGTTIN

  • 描述:当后台作业尝试从终端读取数据时,发送给该作业的进程。

22) SIGTTOU

  • 描述:类似于 SIGTTIN,但发生在尝试向终端写数据时。

23) SIGURG

  • 描述:当“紧急”数据或 out-of-band 数据到达 socket 时,产生该信号。

24) SIGXCPU

  • 描述:当进程超出了 CPU 时间限制时发出。

25) SIGXFSZ

  • 描述:当进程尝试扩展文件至超过文件大小限制时发出。

26) SIGVTALRM

  • 描述:虚拟时钟信号,类似于 SIGALRM,但计算的是进程所用的 CPU 时间。

27) SIGPROF

  • 描述:类似于 SIGALRM 和 SIGVTALRM,但包括进程使用的 CPU 时间以及系统调用的时间。

28) SIGWINCH

  • 描述:当窗口大小发生变化时发出。

29) SIGIO

  • 描述:文件描述符准备就绪,可以进行输入/输出操作时发出。

30) SIGPWR

  • 描述:当系统检测到电源故障时发出。

31) SIGSYS

  • 描述:非法的系统调用。

特殊信号

  • 不可捕获、阻塞或忽略的信号:SIGKILL, SIGSTOP
  • 不能恢复至默认动作的信号:SIGILL, SIGTRAP
  • 默认会导致进程流产的信号:SIGABRT, SIGBUS, SIGFPE, SIGILL, SIGIOT, SIGQUIT, SIGSEGV, SIGTRAP, SIGXCPU, SIGXFSZ
  • 默认会导致进程退出的信号:SIGALRM, SIGHUP, SIGINT, SIGKILL, SIGPIPE, SIGPOLL, SIGPROF, SIGSYS, SIGTERM, SIGUSR1, SIGUSR2, SIGVTALRM
  • 默认会导致进程停止的信号:SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU
  • 默认进程忽略的信号:SIGCHLD, SIGPWR, SIGURG, SIGWINCH

其他补充

  • 在不同的 UNIX 系统中,某些信号的行为可能有所不同。例如,在 4.3BSD 中,SIGIO 被忽略,而在 SVR4 中,SIGIO 退出进程。
  • SIGCONT 信号在进程挂起时是继续执行,否则会被忽略且不能被阻塞。


文章标签:

评论(0)