#C 语言标准库头文件 signal.h
这个头文件提供 信号处理 的相关功能,例如遇到错误时进行跳出。
#示例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
// 信号处理函数
void signal_handler(int signum) {
printf("\n捕获到信号 %d\n", signum);
switch(signum) {
case SIGINT:
printf("接收到 Ctrl+C 中断信号\n");
// 执行清理操作...
exit(signum);
break;
case SIGTERM:
printf("接收到终止信号\n");
break;
case SIGUSR1:
printf("接收到用户自定义信号 1\n");
break;
case SIGUSR2:
printf("接收到用户自定义信号 2\n");
break;
default:
printf("接收到未知信号\n");
}
}
int main(void) {
// 注册信号处理函数
signal(SIGINT, signal_handler); // 中断信号 (Ctrl+C)
signal(SIGTERM, signal_handler); // 终止信号
signal(SIGUSR1, signal_handler); // 用户自定义信号 1
signal(SIGUSR2, signal_handler); // 用户自定义信号 2
printf("程序运行中\n");
printf("类 UNIX 系统可以使用以下命令发送信号:\n");
printf(" kill -SIGUSR1 PID\n");
printf(" kill -SIGUSR2 PID\n");
printf("按 Ctrl+C 可以终止程序\n\n");
// 自动发送信号作为演示
raise(SIGUSR1);
raise(SIGUSR1);
// 无限循环保持程序运行
while(1);
return 0;
}
运行结果:
程序运行中 类 UNIX 系统可以使用以下命令发送信号: kill -SIGUSR1 PID kill -SIGUSR2 PID 按 Ctrl+C 可以终止程序 捕获到信号 10 接收到用户自定义信号 1 捕获到信号 10 接收到用户自定义信号 1 ^C 捕获到信号 2 接收到 Ctrl+C 中断信号
#函数
函数 | 标准 | 说明 |
---|---|---|
signal | C89 | 为指定的信号设置信号处理函数 |
raise | C89 | 产生一个信号 |
#宏
信号 | 标准 | 说明 |
---|---|---|
SIG_IGN | C89 | 作为 signal 的参数,表示忽略该信号 |
SIG_DFL | C89 | 作为 signal 的参数,表示使用默认的处理方式 |
SIG_ERR | C89 | 作为 signal 的返回值,表示出错 |
#信号列表
信号 | 标准 | 说明 |
---|---|---|
SIGABRT | C89 | 中止 |
SIGFPE | C89 | 运算错误 |
SIGILL | C89 | 非法指令 |
SIGINT | C89 | 中断 |
SIGSEGV | C89 | 段错误 |
SIGTERM | C89 | 终止请求 |
注意:
- 信号在不同环境中可能有不同的具体数值
- 并非所有系统都支持表中的全部信号
- 不同环境可能定义有表中不包含的其它信号
类 UNIX 系统可以通过 kill -l
命令查看支持的信号:
user@host:~ $ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
其中常用信号如下:
SIGTERM
- 请求进程正常退出。进程应当按部就班地清理资源并正常终止。关机过程中会触发这个信号。SIGQUIT
- 强力的要求进程退出。进程应当快速清理资源并退出。可以通过Ctrl
+\
触发。SIGKILL
- 强制杀死进程。这个信号不能被signal
函数设置处理函数。SIGHUP
- 终端挂断信号。关闭终端、退出SSH等操作会触发这个信号。SIGINT
- 中断信号。可以通过Ctrl
+C
触发。SIGSTOP
- 暂停程序执行。这个信号不能被signal
函数设置处理函数。可以通过Ctrl
+Z
触发。SIGCONT
- 恢复程序执行。可以通过fg
命令触发。
命令行程序常常使用 Ctrl
+ D
进行正常退出。这个命令并非发送信号,而是发送 EOF
。