1. 信号的概念
信号是一种软件中断,通常是异步发生的,用来通知进程某个事件已经发生。每个信号都有一个唯一的编号和一个宏定义名称,这些宏定义可以在 signal.h 中找到。
使用 kill -l 命令可以查看信号编号。
2. 信号的分类
在 Linux 中,信号被分为标准信号(也称为传统或不可靠信号)和实时信号。它们的主要区别在于编号范围、处理方式以及特性。
1) 标准信号 (Traditional/Standard Signals)
这些信号是早期 Unix 系统定义的,编号通常从 1 到 31。以下是一些常见的标准信号:
SIGHUP(1): 终端挂起或控制进程结束。SIGINT(2): 中断信号,通常是 Ctrl+C 产生的。SIGQUIT(3): 退出信号,产生核心转储。SIGILL(4): 非法指令。SIGTRAP(5): 跟踪陷阱(由调试器使用)。SIGABRT(6): 调用 abort() 函数生成的信号。SIGBUS(7): 总线错误。SIGFPE(8): 浮点异常。SIGKILL(9): 强制终止信号(不可被捕获、阻塞或忽略)。SIGSEGV(11): 段违例。SIGPIPE(13): 管道破裂。SIGALRM(14): 定时器到期。SIGTERM(15): 终止请求。
2) 实时信号 (Real-time Signals)
实时信号是在 POSIX.1b 标准中引入的,用于提供更可靠的信号机制。它们的编号范围从 SIGRTMIN 到 SIGRTMAX。实时信号的特点包括但不限于:不会丢失、支持排队、有序性、可携带数据。
本章只讨论编号 31 以下的信号,不讨论实时信号。
3. 信号的处理
在 Linux 中,信号处理有三种方式:
方式一:执行该信号的默认处理动作
使用命令 man 7 signal 查看信号在什么条件下产生,默认的处理动作是什么。
方式二:忽略此信号
可以通过设置信号处理器来实现。可以将信号处理器设置为 SIG_IGN 来忽略某些信号。但是,不能忽略像 SIGKILL 和 SIGSTOP 这样的不可捕获信号。
#include <iostream>
#include <unistd.h>
#include <signal.h>
int main(){
signal(SIGINT, SIG_IGN); // 将 2 号信号忽略
(){
std::cout << << () << << std::endl;
();
}
;
}


