信号是Linux内核向进程发送的异步软中断通知,不传递数据,只告知“发生了某件事”,用于进程控制、异常响应或简单通信。

信号是什么:一句话说清本质
信号是 Linux 内核向进程发送的异步软中断通知,不传递数据,只告知“发生了某件事”。它像一个轻量级的“事件广播”,用于进程控制、异常响应或简单通信。
最常用信号及默认行为速查
运行 kill -l 可列出全部信号编号与名称。以下为高频信号及其关键特性:
- SIGINT(2):用户按 Ctrl+C 触发,默认终止前台进程;可捕获、忽略或自定义处理。
- SIGTERM(15):kill PID 默认发送的信号,请求进程“优雅退出”;可被拦截,适合正常关机流程。
- SIGKILL(9):强制立即终止进程;无法捕获、无法忽略、无法阻塞;唯一可靠杀死失控进程的方式。
- SIGSTOP(19):暂停进程执行(如 Ctrl+Z);同样不可捕获/忽略,常与 SIGCONT(18) 配合实现挂起/恢复。
- SIGSEGV(11):访问非法内存(如空指针解引用、越界写)时由内核触发;默认终止并生成 core dump(若系统启用)。
- SIGCHLD(17):子进程终止或停止时,内核自动发给父进程;常用于回收僵尸进程(waitpid() 配合使用)。
- SIGUSR1 / SIGUSR2(10/12):完全由用户程序定义用途,适合进程间轻量通知(如重载配置、切换日志级别)。
信号处理的三种方式
进程收到信号后,有且仅有以下三类响应选择:
- 执行默认动作:多数信号默认终止进程(如 SIGINT、SIGTERM),部分生成 core(如 SIGSEGV)、部分忽略(如 SIGCHLD)。
- 忽略信号:调用 signal(SIGxxx, SIG_IGN) 或 sigignore(SIGxxx);但 SIGKILL 和 SIGSTOP 不允许忽略。
- 注册自定义处理函数:用 signal()(简单场景)或更推荐的 sigaction()(支持屏蔽、标志位、可重入等)绑定回调函数。
关键限制与注意事项
信号机制轻便但有明确边界,实际使用需避开常见误区:
- 非实时信号(1–31)不排队:同一信号多次快速到达,可能只递送一次(未决信号位仅标记“有无”,不计数)。
- 信号处理函数中应只调用异步信号安全函数(如 write()、_exit()),避免用 printf()、malloc() 等引发未定义行为。
- 信号不能传递结构化数据,仅作通知;需传参请结合共享内存、管道或文件等其他 IPC 方式。
- 发送信号受权限约束:普通用户只能向同用户进程发信号,root 用户不受限。










