1
嗨我正在从高级编程Unix系统的一些练习。我感兴趣的是分叉和execlp功能的作品。从作者指定的文字分叉创建一个新的过程。它被父母和子女调用一次 - 由父母调用 - 但返回两次。调试劣质进程
所以叉返回一个非负pid给父母,0给孩子。我想用GDB逐步调用这一系列调用,但是我的断点会导致孩子不运行或中断造成父母终止的系统调用。
1 - 如果我设置了一个断点 - 否则if(pid == 0) - >该进程不运行。
2 - 如果我设置了一个断点 - execlp(buf,buf,(char *)0);
我将得到以下错误:
waitpid函数错误:中断系统调用 [劣质1(处理461)退出,代码为01]
做什么选择我都设置在GDB调试父母和孩子?应该在哪里设置断点?
int main(int argc, char *argv[])
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf, MAXLINE, stdin) != NULL)
{
if(buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
if((pid = fork()) < 0)
{
err_sys("fork error");
}
else if(pid == 0)
{
execlp(buf, buf, (char *)0);
err_ret("could'nt execute: %s", buf);
exit(127);
}
if((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}
感谢OznOg ......你的建议工程完全在我的Linux虚拟机,但它不工作时,我在OS X环境中。从文档中我看到以下内容:“在大多数系统上,gdb没有特别的支持来调试使用fork函数创建额外进程的程序。当程序分叉时,gdb将继续调试父进程并且子进程不受阻碍地运行。如果你已经在任何代码中设置了一个断点,那么这个孩子将会得到一个SIGTRAP信号(除非它捕获到信号)将导致它终止。“ – dcrearer
不客气,很遗憾地看到它在osX上无法正常工作。 – OznOg