服务收到 SIGTERM 时怎么「优雅退出」?为什么 Drop 有时不运行?信号会排队吗?哪些信号不能捕获?这篇用真实的子进程和 libc 的 sigaction 逐条验证。
编译:成功 子进程输出: ['子进程开始等待(pid 55836),等 SIGTERM'] 收到 SIGTERM 后:退出码 -15(负数 = 被信号 15 终止),没有 "Guard 被 drop" 这一行
进程启动与 SIGPIPE 见Rust 二进制启动过程;Drop 见Drop Trait 与资源释放。
编译:成功
子进程输出:
installed sigaction,返回 0
工作中(pid 55850),等待 SIGTERM
发现停止标志,处理函数被调用 1 次,退出主循环
Guard(优雅退出) 被 drop —— 清理代码运行了
退出码 0signal-hook、ctrlc 等 crate 把这个模式封装成安全接口,本文用的是直接的 libc 调用。
编译:成功
运行(退出码 0):
不阻塞:连续发 100 次,处理函数被调用 100 次
阻塞期间发 100 次,解除阻塞前处理函数被调用 0 次
解除阻塞后:处理函数共被调用 1 次(100 个信号被合并成 1 个待处理信号) 编译:成功
运行(退出码 0):
对 SIGKILL 安装处理函数:返回 -1;对 SIGTERM:返回 0
errno = Some(22) 编译:成功
运行(退出码 0):
SIGPIPE 当前处理:SIG_IGN(忽略)
SIGINT 当前处理:SIG_DFL(默认)
SIGTERM 当前处理:SIG_DFL(默认)
SIGUSR1 当前处理:SIG_DFL(默认)子进程的发送与等待见子进程与 Command。