You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sigtimedwait突然返回EINTR错误,sigfillset仍无法捕获信号

关于sigtimedwait被EINTR中断且无法获取触发信号的问题

问题场景

我有一段用于超时后终止未结束子进程的代码,核心逻辑如下:

sigaddset(&mask, SIGCHLD);
i = sigtimedwait(&mask, NULL, &timeo);
if (i < 0) {
    assert(errno == EAGAIN);
    i = kill(pid, SIGABRT);
    assert(i == 0 || i == ESRCH);
}
(void) waitpid(pid, &i, 0);

这段代码正常运行约两年后,突然触发断言失败:fellow_log_test.c:720: forkrun: Assertion 'errno == EAGAIN' failed.。通过GDB调试发现此时errno为4,即EINTR(系统调用被中断)。

系统环境信息:

  • Debian 12.2
  • 内核版本:6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-2 (2023-07-27) x86_64 GNU/Linux

排查过程与疑问

我了解常规的do ... while (errno == EINTR)循环处理方式,但希望找到此次虚假唤醒的具体成因。根据文档,sigtimedwait被EINTR中断意味着有其他信号触发,于是我修改代码填充信号掩码并传入siginfo_t结构体以获取信号信息:

sigfillset(&mask);
siginfo_t info = {0};
i = sigtimedwait(&mask, &info, &timeo);

但通过GDB调试发现,info的si_signo等字段全部为0,无法获取到触发中断的信号相关信息。请问这是什么原因?

内容的提问来源于stack exchange,提问作者Nils Goroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:38:27