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 |