信号是内核向进程投递的整数编号,通过kill()发送、sigaction()注册处理函数实现异步通知,构成轻量级ipc;适合发指令而非传数据,需配合volatile sig_atomic_t或实时信号保障可靠性。

信号机制本身不传输数据,但能实现轻量级的进程间异步通知——这是它作为IPC方式的核心价值。它适合“发个提醒”“下个指令”,不适合传结构化数据或大量内容。
信号为什么算进程间通信
信号是内核向进程投递的一个整数编号(如 SIGUSR1=10),接收方可以注册处理函数来响应。一个进程调用 kill() 向另一个进程发送信号,对方在合适时机中断当前执行、跳转到信号处理函数——这个“通知到达+动作响应”的闭环,就构成了最简形式的通信。
典型场景包括:
- 父进程用 SIGCHLD 通知自己:某个子进程已终止
- 用户按 Ctrl+C,终端向前台进程组发送 SIGINT,触发退出逻辑
- 进程 A 发送 SIGUSR2 给进程 B,B 收到后重新加载配置文件
关键操作步骤
要让信号真正起通信作用,需完成三件事:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
发送端:用
kill(pid, sig)或killpg(pgid, sig)发送信号,pid 必须是目标进程的有效 PID,且发送方有权限(通常是同一用户或 root) -
接收端:提前用
signal()或更可靠的sigaction()注册信号处理函数,不能依赖默认行为(比如 SIGTERM 默认终止,无法做自定义逻辑) -
同步保障:信号不排队(除实时信号外),多次发送同一非实时信号可能只触发一次处理。若需可靠通知,常配合全局变量 +
volatile sig_atomic_t标志位,或用信号唤醒pause()/sigsuspend()阻塞等待
实际可用的通信模式
纯信号无法传参数,但可通过组合方式传递语义:
- 状态切换:定义 SIGUSR1 表示“开始工作”,SIGUSR2 表示“暂停”,主控进程发信号,工作进程在 handler 中修改运行状态标志
- 事件触发:监控进程检测到文件变化,发 SIGRTMIN+1 给服务进程,后者收到后主动 reload 数据
- 协同退出:父进程先发 SIGTERM 给子进程,等待几秒;若子进程未退出,再发 SIGKILL 强制结束(注意 SIGKILL 不可捕获)
注意:不要用信号传递复杂数据。需要传内容时,应搭配管道、共享内存等其他 IPC 机制,信号仅作“数据已就绪”的提示。
常见陷阱与规避
信号容易出错,主要因异步性和不可重入性:
- 信号处理函数中只能调用异步信号安全函数(如
write()、_exit()),不能用printf()、malloc()、pthread_create()等 - 避免在 handler 中修改非
sig_atomic_t类型的全局变量,否则可能被中断导致值错乱 - 多个信号同时到达时,普通信号会合并,建议对关键通知使用实时信号(SIGRTMIN ~ SIGRTMAX),它们支持排队和附加数据(通过
sigqueue())










