图片来源:https://www.pixiv.net/artworks/65838500
term 表示信号终止进程,core 表示进程产生核心转储文件并退出,ignore 表示忽略该信号,stop 表示信号停止了进程,cont 表示信号恢复了一个已停止的进程
信号 | 信号值(x86) | 默认行为 | 描述 | 触发场景 |
SIGABRT / SIGIOT | 6 | core | 进程终止信号 | 进程调用 abort() 函数时,系统向进程发送该信号 |
SIGALRM | 14 | term | 实时定时器过期 | 调用 alarm() 或 setitimer() 而设置的实时定时器到期,内核将产生该信号 |
SIGBUS | 7(不可移植) | core | 内存访问错误 | 使用由 mmap() 所创建的内存映射时,如果试图访问的地址超出了底层内存映射文件的结尾,那么将产生该错误 |
SIGCHLD | 17(不可移植) | ignore | 子进程终止、暂停、继续 | 子进程终止、子进程因收到信号而停止或恢复时向父进程发送该信号 |
SIGCONT | 18(不可移植) | cont | 如果被暂停,重新继续执行 | 将该信号发送给已停止的进程,进程将会恢复运行。当接收信号的进程当前不处于停止状态时,默认情况下将忽略该信号 |
SIGEMT | 未定义 | term | 硬件错误 | UNIX 系统通常用该信号来标识一个依赖于实现的硬件错误。Linux 系统仅在 Sun SPARC 实现中使用了该信号 |
SIGFPE | 8 | core | 算术异常 | 在 x86-32 架构中,整数除以 0 总是产生 SIGFPE 信号,但是对浮点数除以 0 的处理则取决于是否启用了 FE_DIVBYZERO 异常。如果启用了该异常(使用feenableexcept() ),那么浮点数除以 0 也将产生 SIGFPE 信号,否则,将为操作数产生符合 IEEE 标准的结果(无穷大的浮点表示形式)。 |
SIGHUP | 1 | term | 挂起 | 检测到控制终端挂起或者控制进程死亡时,进程会收到 SIGHUP。许多守护进程会在收到 SIGHUP 信号时重新进行初始化并重读配置文件。nohup 命令用于无视该信号 |
SIGILL | 4 | core | 非法的指令 | 如果进程试图执行非法(即格式不正确)的机器语言指令,系统将向进程发送该信号 |
SIGINT | 2 | term | 终端中断信号 | 当用户键入终端中断字符(通常为 Ctrl-C )时,终端驱动程序将发送该信号给前台进程组 |
SIGKILL | 9 | term | 杀死 | 此信号为“必杀(sure kill)”信号,处理器程序无法将其阻塞、忽略或者捕获,故而“一击必杀”,总能终止进程 |
SIGIO / SIGPOLL | 29(不可移植) | term | I/O 时可能产生 | 利用 fcntl() 系统调用,即可于特定类型(诸如终端和套接字)的打开文件描述符发生 I/O 事件时产生该信号 |
SIGPIPE | 13 | term | 管道断开 | 当某一进程试图向管道、FIFO 或套接字写入信息时,如果这些设备并无相应的阅读进程,那么系统将产生该信号 |
SIGPROF | 27(不可移植) | term | 性能调优定时器超时 | 由 setitimer() 调用所设置的性能分析定时器到期时,内核产生该信号。性能分析定时器用于记录进程所使用的 CPU 时间。与虚拟定时器不同,性能分析定时器在对 CPU 时间计数时会将用户态与内核态都包含在内 |
SIGPWR | 30(不可移植) | term | 电量将耗尽 | 这是电源故障信号。当系统配备有不间断电源(UPS)时,可以设置守护进程来监控电源发生故障时备用电池的剩余电量。如果电池电量行将耗尽(长时间停电之后),那么监控进程会将该信号发往 init 进程,而后者则将其解读为快速、有序关闭系统的一个请求 |
SIGQUIT | 3 | core | 终端退出信号 | 当用户在键盘上键入退出字符(通常为 Ctrl-\ )时,该信号将发往前台进程组。默认情况下,该信号终止进程,并生成可用于调试的核心转储文件 |
SIGSEGV | 11 | core | 非法的内存引用 | 当应用程序对内存的引用无效时,就会产生该信号,如引用的页不存在、试图更新只读内存中某一位置的内容、在用户态访问内核的部分内存。C 语言中引发这些事件的往往是解引用的指针里包含了错误地址(例如,未初始化的指针) |
SIGSTKFLT | 16(不可移植) | term | 协处理器栈错误 | Linux 对该信号作了定义,但并未使用 |
SIGSTOP | 19(不可移植) | stop | 暂停执行 | 这是一个必停啊(sure stop)信号,处理器程序无法将其阻塞、忽略或者捕获,故而总是能停止进程 |
SIGSYS / SIGUNUSED | 31(不可移植) | core | 无效的系统调用 | 如果进程发起的系统调用有误,那么将产生该信号。这意味着系统将进程执行的指令视为一个系统调用陷阱(trap),但相关的系统调用编号却是无效的 |
SIGTERM | 15 | term | 终止信号 | 这是用来终止进程的标准信号,也是 kill 和 killall 命令所发送的默认信号。精心设计的应用程序应当为 SIGTERM 信号设置处理器程序,以便于其能够预先清除临时文件和释放其他资源。发送 SIGKILL 信号可以杀掉某个进程,从而绕开了 SIGTERM 信号的处理器程序。因此,总是应该首先尝试使用 SIGTERM 信号来终止进程,而把 SIGKILL 信号作为最后手段 |
SIGTRAP | 5 | core | 追踪/断点陷阱 | 该信号用来实现断点调试功能以及 strace 命令所执行的跟踪系统调用功能 |
SIGTSTP | 20(不可移植) | stop | 终端中止信号 | 这是作业控制的停止信号,当用户在键盘上输入挂起字符(通常是 Ctrl-Z )时,将发送该信号给前台进程组,使其停止运行 |
SIGTTIN | 21(不可移植) | stop | 后台进程尝试读 | 在作业控制 shell 下运行时,若后台进程组试图对终端进行 read() 操作,终端驱动程序将向该进程组发送此信号 |
SIGTTOU | 22(不可移植) | stop | 后台进程尝试写 | 在作业控制 shell 下运行时,如果对终端启用了 TOSTOP 选项(可能是通过 stty tostop 命令),而某一后台进程组试图对终端进行 write()操作,那么终端驱动程序将向该进程组发送 SIGTTOU 信号 |
SIGURG | 23(不可移植) | ignore | 套接字上的紧急数据 | 系统发送该信号给一个进程,表示套接字上存在带外(也称作紧急)数据 |
SIGUSR1 | 10(不可移植) | term | 用户自定义信号1 | 该信号和 SIGUSR2 信号供程序员自定义使用。内核绝不会为进程产生这些信号。进程可以使用这些信号来相互通知事件的发生,或是彼此同步 |
SIGUSR2 | 12(不可移植) | term | 用户自定义信号2 | 同 SIGUSR1 |
SIGVTALRM | 26(不可移植) | term | 虚拟定时器超时 | 调用 setitimer() 设置的虚拟定时器刚一到期,内核就会产生该信号。虚拟定时器计录的是进程在用户态所使用的 CPU 时间 |
SIGXCPU | 24(不可移植) | core | 超出CPU时间限制 | 当进程的 CPU 时间超出对应的资源限制时,将发送此信号给进程 |
SIGXFSZ | 25(不可移植) | core | 超出文件大小限制 | 如果进程因试图增大文件(调用 write() 或 truncate() )而突破对进程文件大小的资源限制,发送此信号给进程 |
SIGWINCH | 28(不可移植) | ignore | 终端窗口大小已变化 | 在窗口环境中,当终端窗口尺寸发生变化时(要么是由于用户手动调整了大小,要么是因为程序调用 ioctl()对大小做了调整),借助于为该信号安装的处理器程序,诸如 vi 和 less 之类的程序会在窗口尺寸调整后重新绘制输出。 |
参考:
《Linux/Unix 系统编程手册》
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。