<signal.h> — 信号处理

头文件: #include <signal.h>
提供进程间异步通知机制——信号(signal)的处理。C 标准仅规定最小子集,POSIX 大幅扩展。


核心类型与函数

类型/函数签名说明
sig_atomic_tvolatile sig_atomic_t flag;可被信号处理器原子访问的整数类型
signalvoid (*signal(int sig, void (*func)(int)))(int)注册信号 sig 的处理函数 func
raiseint raise(int sig)向当前进程发送信号 sig

标准信号常量

常量典型含义触发方式
SIGINT中断Ctrl+C
SIGILL非法指令执行无效机器码
SIGFPE浮点异常除零、溢出
SIGSEGV段错误非法内存访问(NULL 解引用)
SIGTERM终止请求kill 命令
SIGABRT异常终止abort() 函数

signal 函数

void (*signal(int sig, void (*func)(int)))(int);

func 可设置为:

含义
SIG_DFL恢复默认处理
SIG_IGN忽略信号(SIGKILL 和 SIGSTOP 不可忽略)
用户函数指针收到信号时调用

signal 行为因 UNIX 版本而异。推荐使用 POSIX 的 sigaction 以获得可移植行为。


信号处理器中的安全操作

信号处理器运行在中断上下文中,只能调用异步信号安全的函数。

C 标准保证可安全调用:

操作示例
写入 volatile sig_atomic_t 变量flag = 1;
调用 abort()终止程序
调用 _Exit()立即退出
调用 signal() 重新注册仅限相同信号

严禁在信号处理器中调用 printf, malloc, free, fopen, exit 等(可能因持有锁导致死锁)。

最安全的模式:信号处理器中设置 volatile sig_atomic_t 标志,主循环轮询。


跨语言参考