子进程接收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
相关产品推荐
相关产品推荐

