C 编程/signal.h
signal.h 是 C 标准库中定义的一个头文件,用于指定程序在执行期间如何处理信号。信号可以报告程序中的某些异常行为(例如除以零),或者信号可以报告程序外部的某些异步事件(例如有人在键盘上按下交互式注意键)。
信号可以通过调用 raise
(向当前进程发送信号)或 kill
(向任何进程发送信号)来生成。每个实现都会定义它生成(如果有)的信号以及在什么情况下生成它们。实现可以定义除这里列出的信号之外的其他信号。标准头文件 <signal.h> 可以定义以 SIG 开头的名称的附加宏,以指定附加信号的值。所有这些值都是整数常量表达式 >= 0。
除了两个信号(SIGKILL 和 SIGSTOP 不能被捕获、阻止或忽略)之外,可以为所有信号指定信号处理程序。信号处理程序是一个函数,当发生相应信号时,目标环境会调用它。目标环境会暂停程序的执行,直到信号处理程序返回或调用 longjmp。为了最大限度地移植,异步信号处理程序只应
- 对 signal 函数进行调用(成功)
- 为 volatile
sig_atomic_t
类型的对象赋值 - 将控制权返回给它的调用者
如果信号报告程序内的错误(并且信号不是异步的),信号处理程序可以通过调用 abort
、exit
或 longjmp
来终止。
int raise(int sig)
。这会人为地引发信号。它会导致生成信号 sig。sig 参数与 SIG 宏兼容。如果调用成功,则返回零。否则返回一个非零值。
示例
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
static void catch_function(int signal) {
puts("Interactive attention signal caught.");
}
int main(void) {
if (signal(SIGINT, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr);
return EXIT_FAILURE;
}
puts("Raising the interactive attention signal.");
if (raise(SIGINT) != 0) {
fputs("Error raising the signal.\n", stderr);
return EXIT_FAILURE;
}
puts("Exiting.");
return 0;
}
psignal(int sig, const char *s)
,在 stderr 上输出信号编号的字符串表示形式。它在 4.3BSD、Solaris 和 Linux 中,但没有被 POSIX 或 Single UNIX Specification 指定。
在相同的系统上,string.h 包含非标准的 strsignal(int sig)
,它类似于 strerror 的工作方式。
void (* signal(int sig, void (*func)(int)) )(int)
,设置当程序接收到信号sig
时采取的操作。如果 func 的值为 SIG_DFL,将发生该信号的默认处理。如果 func 的值为 SIG_IGN,则将忽略该信号。否则,func 指向一个信号处理程序函数,当信号发生时将调用该函数。
func 函数可以通过执行 return 语句或调用 abort、exit 或 longjmp 函数来终止。如果 func 执行 return 语句,并且 sig 的值为 SIGFPE 或任何其他与计算异常相对应的实现定义的值,则行为未定义。否则,程序将在被中断的地方恢复执行。如果函数返回并且可以满足返回请求,则 signal 函数将返回 func 的值,用于最近一次对指定信号 sig 的 signal 的调用。否则将返回 SIG_ERR 的值,并且将在 errno 中存储一个正值。
如果信号不是由于调用 abort 或 raise 函数而产生的,则行为未定义,如果信号处理程序调用标准库中的任何函数(除了 signal 函数本身(第一个参数是与导致调用处理程序的信号相对应的信号编号)之外)或引用任何具有状态存储持续时间的对象,而不是通过将值分配给 volatile sig_atomic_t 类型的静态存储持续时间变量。此外,如果对 signal 函数的此类调用导致 SIG_ERR 返回,则 errno 的值是不确定的。[1]
typedef i-type sig_atomic_t
- SIG_DFL - 用于设置默认信号处理。
- SIG_IGN - 用于通过忽略信号来处理信号。
- SIG_ERR - 用于错误的数字。
常量 | 含义 | 系统 |
---|---|---|
SIGHUP | 挂断 | POSIX |
SIGINT | 中断 | ANSI |
SIGQUIT | 退出 | POSIX |
SIGILL | 非法指令 | ANSI |
SIGABRT | 中止 | ANSI |
SIGTRAP | 跟踪陷阱 | POSIX |
SIGABRT | IOT 陷阱 | 4.2 BSD |
SIGEMT | EMT 陷阱 | 4.2 BSD |
SIGINFO | 信息 | 4.2 BSD |
SIGFPE | 浮点异常 | ANSI |
SIGKILL | 杀死,不可阻止 | POSIX |
SIGBUS | 总线错误 | 4.2 BSD |
SIGSEGV | 段错误 | ANSI |
SIGSYS | 系统调用参数错误 | 4.2 BSD |
SIGPIPE | 管道破裂 | POSIX |
SIGALRM | 闹钟 | POSIX |
SIGTERM | 终止 | ANSI |
SIGUSR1 | 用户定义的信号 1 | POSIX |
SIGUSR2 | 用户定义的信号 2 | POSIX |
SIGCHLD | 子进程状态已更改 | POSIX |
SIGCLD | 与 SIGCHLD 相同 | System V |
SIGPWR | 电源故障重启 | System V |
SIGXCPU | 超出 CPU 时间 | POSIX |
SIGSTOP | 暂停执行 | POSIX |
SIGCONT | 恢复执行 | POSIX |