Linux 信号编程知识点总结
信号名称 | 信号编号 | 描述 |
---|---|---|
SIGHUP | 1 | 终端挂断或控制进程终止 |
SIGINT | 2 | 中断进程(Ctrl+C) |
SIGQUIT | 3 | 退出进程并生成核心转储 |
SIGILL | 4 | 非法指令 |
SIGTRAP | 5 | 跟踪/断点陷阱 |
SIGABRT | 6 | 由abort函数发出的中止信号 |
SIGBUS | 7 | 总线错误 |
SIGFPE | 8 | 浮点异常 |
SIGKILL | 9 | 强制终止进程 |
SIGUSR1 | 10 | 用户自定义信号1 |
SIGSEGV | 11 | 段错误 |
SIGUSR2 | 12 | 用户自定义信号2 |
SIGPIPE | 13 | 管道破裂 |
SIGALRM | 14 | 闹钟超时 |
SIGTERM | 15 | 终止信号 |
SIGCHLD | 17 | 子进程状态改变 |
SIGCONT | 18 | 恢复停止的进程 |
SIGSTOP | 19 | 停止进程 |
SIGTSTP | 20 | 终端停止进程(Ctrl+Z) |
信号处理
在C语言中,可以使用signal
函数来注册信号处理程序:
#include <stdio.h>
#include <signal.h>
void signal_handler(int signo) {
printf("Received signal: %d\n", signo);
// 处理信号的代码
}
int main() {
// 注册信号处理程序
signal(SIGINT, signal_handler);
// 其他主程序逻辑
}
信号发送
使用kill命令或kill()函数可以向进程发送信号:
kill -SIGTERM <pid>
或者在C语言中:
#include <signal.h>
int main() {
// 向进程发送终止信号
kill(<pid>, SIGTERM);
return 0;
}
信号阻塞与解除阻塞
使用sigprocmask函数来阻塞或解除阻塞信号:
#include <stdio.h>
#include <signal.h>
int main() {
// 阻塞指定信号
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigprocmask(SIG_BLOCK, &mask, NULL);
// 解除阻塞指定信号
sigprocmask(SIG_UNBLOCK, &mask, NULL);
return 0;
}