我正在研究C中的基本shell。在pipes的实现中,我计算了行上的命令,并迭代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()
导致段错误的情况下?我该如何调试这类事情?
答案 0 :(得分:1)
查看你正在调用wait()的参数,并查找内存覆盖问题。通过Valgrind运行您的程序,以获得非常容易检测到许多覆盖的帮助。
答案 1 :(得分:1)
您可能正在将status参数的无效指针传递给wait(2)。
至于如何调试此类事情,我的第一步是安装C库的调试符号。然后查看哪个指针发生错误并将其追溯到堆栈(如果可能)。