C 语言中的 signal.h
头文件提供了一种处理程序执行期间报告的不同信号的机制。它定义了一些变量类型、宏和函数,让程序能够更灵活地响应来自操作系统或其他进程的信号。
sig_atomic_t 类型
sig_atomic_t
类型是一种在信号处理程序中使用的整数类型。它保证在信号处理程序中访问时是原子性的,即使在异步信号的情况下也能保持一致性。
库宏
SIG_DFL
SIG_DFL
宏表示默认的信号处理程序。
SIG_ERR
SIG_ERR
宏表示一个信号错误。
SIG_IGN
SIG_IGN
宏表示忽略信号。
SIG 宏
SIG
宏用于表示不同条件下的信号码,如下:
SIGABRT
: 程序异常终止。SIGFPE
: 算术运算出错,如除数为 0 或溢出。SIGILL
: 非法函数映象,如非法指令。SIGINT
: 中断信号,如 ctrl-C。SIGSEGV
: 非法访问存储器,如访问不存在的内存单元。SIGTERM
: 发送给本程序的终止请求信号。
库函数
signal()
c
#include <stdio.h>
#include <signal.h>
void signal_handler(int sig) {
printf("Received signal: %d\n", sig);
}
int main() {
// Register signal handler for SIGINT
signal(SIGINT, signal_handler);
printf("Signal handling registered. Press Ctrl-C to trigger SIGINT.\n");
while (1) {
// Main loop
}
return 0;
}
raise()
c
#include <stdio.h>
#include <signal.h>
int main() {
// Raise SIGINT signal
raise(SIGINT);
return 0;
}
这些例子展示了如何使用 signal.h
库中的宏和函数来处理信号。signal()
函数用于设置信号处理程序,raise()
函数用于生成指定的信号。通过这些功能,程序可以更好地响应来自操作系统或其他进程的信号,并根据需要采取适当的行动。
在POSIX标准中,对于信号处理函数的注册和执行是在操作系统层面完成的,因此无论调用多少次raise(SIGINT)
或signal(SIGINT, signal_handler)
,信号处理函数都只会执行一次。这是因为每个信号在进程中只能有一个相关联的处理函数。