Unix信号列表
SIGABRT和SIGIOT
SIGABRT 和 SIGIOT 信号能让程序异常终止(abort)。 该信号通常是由进程自身调用 C标准函数库 的 abort() 函数来触发, 但它也可以像其它信号一样由外部发送给进程。
SIGALRM, SIGVTALRM 和 SIGPROF
如果你用 setitimer 这一类的报警设置函数设置了一个时限,到达时限时进程会接收到 SIGALRM, SIGVTALRM 或者 SIGPROF。但是这三个信号量的含义各有不同,SIGALRM 计时的是真实时间,SIGVTALRM计时的是进程使用了多少CPU时间,而 SIGPROF 计时的是进程和代表该进程的内核用了多少时间。
SIGBUS
总线发生错误时,进程接收到一个SIGBUS信号。举例来说,存储器访问对齐或者或不存在对应的物理地址都会产生SIGBUS信号。
SIGCHLD
当子进程终止、被中断或被中断后恢复时,SIGCHLD信号被发送到进程。该信号的一个常见用法是指示操作系统在子进程终止后清理其使用的资源,而不显式调用等待系统调用。
SIGCONT
SIGCONT信号指示操作系统继续(重启)先前由SIGSTOP或SIGTSTP信号暂停的进程。Unix 壳的作业控制是该信号的一个重要应用。
SIGFPE
当进程执行了一个错误的算术运算时,例如被零除,信号被发送到一个进程。这可能包括整数被零除,以及整数在除结果中溢出(在C中只有INT_MIN/-1、INT64_MIN/-1和%-1会触发该行为)。注意该信号与浮点数溢出无关。
SIGHUP
检测到控制中断挂起或者控制进程死亡时,进程会收到 SIGHUP。现在操作系统,该信号通常意味着使用的 虚拟终端 已经被关闭。许多 守护进程 在接收到该信号时,会重载他们的设置和重新打开日志文件(logfiles),而不是去退出程序。nohup 命令用于无视该信号。
SIGILL
当进程试图执行非法、格式错误、未知或特权指令时,SIGILL信号被发送到该进程。
SIGINT
当用户希望中断进程时,SIGINT信号由用户的控制终端发送到进程。这通常通过按下Ctrl+C来发送,但是在某些系统中,可以使用“DELETE”键或“BREAK”键。
SIGKILL
主条目:SIGKILL
发送SIGKILL信号到一个进程可以使其立即终止(KILL)。与SIGTERM和SIGINT相不同的是,这个信号不能被捕获或忽略,接收过程在接收到这个信号时不能执行任何清理。 以下例外情况适用:
- 僵尸进程不能被杀死,因为它们已经死了,正在等待它们的父进程来收获它们。
- 处于阻塞状态的进程不会死亡,直到它们再次醒来。
- init 进程是特殊的: init不接收任何它不打算处理的信号,因此它会忽略SIGKILL。这条规则有一个例外,Linux 上的 init 如果被 ptrace 了,那么它是可以接收 SIGKILL 并被杀死的。
- 处于不可中断的睡眠的进程即使发送了SIGKILL,也有可能不会终止(并释放其资源)。这是少数 Unix 系统必须重新启动才能解决临时软件问题的几种情况之一。
- 当在大多数系统关闭程序中终止进程时,如果进程没有响应 SIGTERM 而自动退出,SIGKILL 是最后的手段。为了加快电脑关机过程,苹果OS X 10.6(又名雪豹)向标记自己为“clean”的进程发送SIGKILL,从而加快关机时间,而且可能不会产生任何不良影响。在 Linux 中执行 killall -9 命令具有类似不过更危险的效果;它不让程序保存未保存的数据。
SIGPIPE
当一个进程试图写入一个没有连接到另一端进程的管道时,SIGPIPE信号会被发送到该进程。
SIGPOLL
当一个事件发生在一个正在显式监视的文件描述符上时,就会发送SIGPOLL信号。有效使用这种用法可以进行异步 I/O,因为内核将代替调用者轮询描述符。它提供了主动轮询的替代方案。
SIGRTMIN 到 SIGRTMAX
SIGRTMIN至SIGRTMAX信号用于用户自定义的目的。它们是实时信号。
SIGTTIN 和 SIGTTOU
当进程在后台试图分别从tty读取或写入时,SIGTTIN和SIGTTOU信号会被发送到该进程。通常,这些信号仅由作业控制下的进程接收;守护进程没有控制终端,因此永远不会接收这些信号。
SIGQUIT
当用户在进程的控制终端请求退出进程并进行核心转储时,SIGQUIT信号会被发送到该进程。
SIGSEGV
当进程试图访问无效内存引用时发生存储器区块错误,SIGSEGV信号会被发送到该进程。
SIGSTOP
当操作系统暂停进程的运行时,会产生SIGSTOP信号。SIGSTOP信号无法被捕获或无视。
SIGSYS
当系统调用时传入非法的参数,会产生SIGSYS信号。实际上,SIGSYS信号很少会出现,因为应用程序依赖库调用系统调用。SIGSYS可以被违反Linux Seccomp安全规则的应用程序捕获。SIGSYS也可用于模拟外部系统调用,例如:在Linux上模拟 Windows系统调用。
SIGTERM
当用户请求终止进程时,会产生SIGTERM信号。SIGTERM信号可以被捕获或无视。这允许该进程在结束前释放掉所占用的资源并保存其状态。SIGINT和SIGTERM非常相似。
SIGTSTP
当用户在进程的控制终端请求退出进程时,会产生SIGTSTP信号。SIGTSTP信号可以被捕获或无视。SIGTSTP信号的产生通常是由于用户按下Ctrl+Z。
默认行为
一个进程可以自定义如何处理传入的POSIX信号。如果一个进程没有定义一个信号处理程序,那么这个信号的默认处理程序将被使用。下表列出了一些与POSIX兼容的UNIX系统的默认操作,例如FreeBSD、OpenBSD和Linux。
信号 | 可移植代号 | 默认行为 | 描述 |
---|---|---|---|
SIGABRT | 6 | 终止 (核心转储) | 进程终止信号 |
SIGALRM | 14 | 终止 | 计时器告警 |
SIGBUS | 不适用 | 终止 (核心转储) | 访问内存对象未定义区域 |
SIGCHLD | 不适用 | 忽略 | 子进程终止、暂停、继续 |
SIGCONT | 不适用 | 继续 | 如果被暂停,重新继续执行 |
SIGFPE | 8 | 终止 (核心转储) | 错误的算术运算 |
SIGHUP | 1 | 终止 | 挂起 |
SIGILL | 4 | 终止 (核心转储) | 非法的指令 |
SIGINT | 2 | 终止 | 终端中断信号 |
SIGKILL | 9 | 终止 | 杀死 (无法被捕获或忽略 |
SIGPIPE | 13 | 终止 | 写入一个没有连接另一端的管道 |
SIGPOLL | 不适用 | 终止 | 可轮询事件 |
SIGPROF | 不适用 | 终止 | 性能调优定时器超时 |
SIGQUIT | 3 | 终止 (核心转储) | 终端退出信号 |
SIGSEGV | 11 | 终止 (核心转储) | 非法的内存引用 |
SIGSTOP | 不适用 | 暂停 | 暂停执行(无法被捕获或忽略 |
SIGSYS | 不适用 | 终止 | (核心转储) |
SIGTERM | 15 | 终止 | 终止信号 |
SIGTRAP | 5 | 终止 (核心转储) | 追踪/断点陷阱 |
SIGTSTP | 不适用 | 暂停 | 终端中止信号 |
SIGTTIN | 不适用 | 暂停 | 后台进程尝试读 |
SIGTTOU | 不适用 | 暂停 | 后台进程尝试写 |
SIGUSR1 | 不适用 | 终止 | 用户自定义信号1 |
SIGUSR2 | 不适用 | 终止 | 用户自定义信号2 |
SIGURG | 不适用 | 忽略 | Out-of-band data is available at a socket |
SIGVTALRM | 不适用 | 终止 | 虚拟定时器超时 |
SIGXCPU | 不适用 | 终止 (核心转储) | 超出CPU时间限制 |
SIGXFSZ | 不适用 | 终止 (核心转储) | 超出文件大小限制 |
SIGWINCH | 不适用 | 忽略 | 终端窗口大小已变化 |