我正在测试旨在检测子进程何时出现段错误的代码。当这段代码并不总是段错误时,想象一下我的惊讶:
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
我在 Debian Linux 2.6.26 内核下运行;ksh93
我的外壳是来自 Debian软件包的 AT&T ksh
,版本 M 93s+ 2008-01-31。有时这个程序会出现段错误,但否则它只是以非零退出状态但没有消息而静默终止。我的信号检测程序报告以下内容:
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
在 pure 下运行ksh
表明 segfault 也很少见:
Running...
Running...
Running...
Running...
Running...
Running... Memory fault
Running...
有趣的是,bash
每次都能正确检测到段错误。
我有两个问题:
谁能解释这种行为?
任何人都可以建议一个简单的 C 程序,它会在每次执行时可靠地发生段错误吗?我也尝试过
kill(getpid(), SIGSEGV)
,但我得到了类似的结果。
编辑:jbcreix 有答案:我的段错误检测器坏了。我被愚弄了,因为ksh
有同样的问题。我尝试过bash
并且bash
每次都做对了。
我的错误是我传递WNOHANG
到waitpid()
,我应该传递零。我不知道我当时在想什么!有人想知道 是怎么回事ksh
,但这是一个单独的问题。