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

子进程接收SIGQUIT无核心转储提示,但状态显示已生成核心转储

SIGQUIT信号在父子进程中的行为差异问题

学习C语言编写Shell时,遇到SIGQUIT信号的异常表现:

  • 普通C程序收到Ctrl-</kbd>发送的SIGQUIT信号时,会终止并输出Quit (core dumped),和bash中执行cat后按该组合键的表现一致。
  • 但当父进程设置忽略SIGQUIT(signal(SIGQUIT, SIG_IGN)),通过fork创建子进程并让子进程恢复SIGQUIT的默认处理(signal(SIGQUIT, SIG_DFL))后,子进程收到SIGQUIT会终止,却不会输出Quit (core dumped)提示。使用waitpid获取子进程状态,通过WTERMSIG分析得出终止信号为3(即SIGQUIT)。

以下是演示问题的示例代码:

int main(int argc, char **argv, char **envp)
{
    signal(SIGQUIT, SIG_IGN);
    int pid = fork();
    // signal(SIGQUIT, SIG_IGN);
    if (pid == 0)
    {
        signal(SIGQUIT, SIG_DFL);
        // execve("/usr/bin/cat", argv, envp);
        char buffer[100];
        read(0, buffer, 50);
        printf("buffer: %s\n", buffer);
        return (0);
    }
    int status;
    waitpid(pid, &status, 0);
    printf("Status: %i\n", WIFSIGNALED(status));
    if (WIFSIGNALED(status))
        printf("Signal: %i\n", WTERMSIG(status));
    #ifdef WCOREDUMP
        if (WCOREDUMP(status))
            printf("Core dumped!\n");
    #endif
    return (0);
}

已尝试的操作:

  • 执行ulimit -c unlimited
  • 在fork前后设置SIGQUIT为SIG_IGN(示例代码中有注释)
  • 通过execve执行cat,表现相同
  • 不使用fork运行程序时表现正常
  • 设置core_uses_pid为1
  • 设置core_pipe_limit为0
  • 配置core_pattern为|/wsl-capture-crash %t %E %p %s
  • 在WSL2 Ubuntu及普通Ubuntu环境测试,表现一致

疑问:
这种行为是否属于预期情况?如果是,原因是什么?希望让自己编写的Shell信号处理行为与bash类似,实现cat被中断时和bash中一致的表现;若无法实现,也想了解父子进程行为差异的原因。

另外这是第一次提问,若有需要改进的地方请告知。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:53:10