0

我正在使用 C 语言开发一个基本的 shell。在我的管道实现中,我计算了线上的命令并迭代地fork()创建了一个新进程。

在每次迭代结束时,我wait()在子节点上进行下一个命令。这在早期的代码中运行良好,但不知何故我打破了它:

Program terminated with signal 11, Segmentation fault.
#0  0xfef28730 in _waitpid () from /usr/lib/libc.so.1

(gdb) backtrace
#0  0xfef28730 in _waitpid () from /usr/lib/libc.so.1
#1  0xfef28770 in _wait () from /usr/lib/libc.so.1
#2  0xfef696d1 in wait () from /usr/lib/libc.so.1
#3  0x08051428 in main ()

我知道wait()如果孩子已经终止,那只会收获僵尸进程。

为什么,在什么情况下会wait()导致段错误?我该如何调试这种事情?

4

2 回答 2

1

查看您调用 wait() 的参数,并查找内存覆盖问题。通过Valgrind运行您的程序以获得帮助,非常容易地检测许多覆盖。

于 2009-12-07T15:39:18.833 回答
1

您可能将状态参数的无效指针传递给 wait(2)。

至于如何调试这种东西,我的第一步是为你的 C 库安装调试符号。然后查看它的故障指针并在堆栈中跟踪它(如果可能的话)。

于 2009-12-07T15:42:19.803 回答