【发布时间】:2015-11-19 18:07:18
【问题描述】:
您好,我正在做一些高级编程 Unix 系统的练习。我对 fork 和 execlp 函数的工作原理很感兴趣。作者从文本中指定 fork 创建了一个新进程。它被调用一次 - 由父级调用 - 但返回两次 - 在父级和子级中。
所以 fork 向父级返回一个非负 pid,向子级返回 0。我想通过 GDB 逐步完成这一系列调用,但是我的断点导致子进程不运行或中断系统调用,从而导致父进程终止。
1 - 如果我设置断点 - else if(pid == 0) -> 进程不会运行。
2 - 如果我设置断点 - execlp(buf, buf, (char *)0);
我得到以下错误:
waitpid 错误:系统调用中断 [Inferior 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);
}
【问题讨论】:
标签: c debugging unix operating-system gdb