优雅处理中断信号需区分sigint(用户ctrl+c)和sigterm(系统退出请求),均应捕获并执行清理逻辑;c/c++用sigaction()注册处理器、shell用trap、systemd需配killmode=process与timeoutstopsec。

优雅处理中断信号,核心是让进程在被终止前有机会完成清理——关连接、刷缓存、删临时文件、保存状态。不是立刻退出,而是“收到信号→暂停新任务→处理完手头事→再退出”。
SIGINT 和 SIGTERM 要区分对待
SIGINT(编号2)通常来自用户按 Ctrl+C,属于交互式中断;SIGTERM(编号15)则是系统或运维发的“请退出”请求,更常用于服务管理。两者默认都终止进程,但都可被捕获并自定义行为。
- SIGINT 适合做本地脚本或开发工具的中断响应,比如清理临时目录、释放锁
- SIGTERM 是 systemd、容器平台、监控系统调用的标准退出信号,必须支持且优先响应
- 两者都不该直接忽略(除非有强理由),也不该只打印一句就 exit——那不算优雅
用 signal() 或 sigaction() 注册处理函数
C/C++ 程序中,需在启动早期注册信号处理器。推荐用 sigaction(),它比 signal() 更可靠,能避免竞态、控制阻塞掩码、指定是否重启被中断的系统调用。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 处理函数里不要调用非异步信号安全函数(如 printf、malloc、free),可用 write()、_exit()、signal() 等
- 设置全局 volatile 标志位(如 volatile sig_atomic_t keep_running = 1),主循环检查该标志决定是否继续
- 若主逻辑含阻塞调用(如 read(), accept(), recv()),需检查返回值是否为 -1 且 errno == EINTR,并主动重试
Shell 脚本用 trap 实现轻量级优雅退出
对 Bash/Shell 脚本,trap 是最直接的方式。它能在收到信号时执行清理函数,避免残留临时文件、未释放锁或僵尸进程。
- 常用组合:trap 'cleanup; exit 1' SIGINT SIGTERM,同时覆盖两种中断场景
- cleanup 函数里应包含 rm -rf 临时目录、kill 子进程、关闭 fd、记录日志等操作
- 注意 trap 不会捕获 SIGKILL(9)和 SIGSTOP(19),这两者无法被拦截,属于系统强制手段
systemd 服务要配对 KillMode 和超时时间
如果你的服务由 systemd 管理,光写好程序还不够——systemd 的默认行为可能绕过你的优雅逻辑。
- 设 KillMode=process:确保只有主进程收到 SIGTERM,子进程由主进程自行协调退出,避免 worker 被误杀
- 设 TimeoutStopSec=20(单位秒):给主进程留出足够时间完成清理,超时后 systemd 才发 SIGKILL 强制结束
- 不写 ExecStop=:只要程序本身响应 SIGTERM,就不需要额外 kill 命令,否则反而破坏原生优雅流程










