signal.h
(重定向自Csignal)
signal.h
是C标准函数库中的信号处理部分, 定义了程序执行时如何处理不同的信号。信号用作进程间通信, 报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。
C++中的对应头文件是csignal
。
标准信号
C语言标准定义了6个信号。都定义在signal.h
头文件中[1]。
SIGABRT
- 异常中止。SIGFPE
- 浮点异常。SIGILL
- 无效指令。SIGINT
- 交互的用户按键请求,默认情况下,这会导致进程终止。SIGSEGV
- 无效内存访问。SIGTERM
- 程序的中止请求。
signal.h
可能还定义了其它信号,这依赖于具体实现。例如,类Unix系统还定义了15个以上的信号[2]。Visual C++的C标准库只支持C语言标准规定的6个信号,即对信号处理只提供最小的支持。
信号处理
库函数raise()
或者系统调用kill()
可以产生信号。raise()
发送一个信号给当前进程,kill()
发送一个信号给特定进程。
除了两个信号SIGKILL与SIGSTOP不能被捕获(caught)、阻塞(blocked)或者忽略,其它的信号都可以指定处理函数(handler)。一个信号的处理函数在信号到达时,被目标环境调用。目标环境挂起当前进程的执行,直到信号处理函数返回或者调用了longjmp()
。为了最大的兼容性,异步信号处理只应:
- 成功调用了
signal()
指定的函数; - 给类型为
sig_atomic_t
的对象赋值; - 把控制返回给它的调用者。
如果信号报告了进程的错误,信号处理函数应该调用abort()
, exit()
或longjmp()
。
函数
函数 | 描述 |
---|---|
raise
|
人工抛出一个信号 |
signal
|
当程序收到特定信号时应该执行的处理函数 |
例子
#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;
}
参见
参考文献
- ^ ISO/IEC 9899:1999 specification (PDF). . p. 258, § 7.14 Signal handling [2012-11-06]. (原始内容 (PDF)存档于2011-01-24).
- ^ The Open Group Base Specifications Issue 6 - signal.h - signals. [10 January 2012]. (原始内容存档于2012-12-12).