gpt4 book ai didi

创建 UNIX Shell,对 fork 和 child pid 感到困惑?

转载 作者:行者123 更新时间:2023-11-30 15:37:59 24 4
gpt4 key购买 nike

这是我的评估函数代码,它在 main 中调用。

void eval(char *cmdline)
{
char *argv[MAXARGS]; /* argv for execve() */
int bg; /* should the job run in bg or fg? */
pid_t pid; /* process id */

bg = parseline(cmdline, argv);
struct job_t tempJob;
if (builtin_cmd(argv) == 0)
{
if ((pid = fork()) == 0)
{ /* child runs user job */
if (execve(argv[0], argv, environ) < 0)
{
printf("%s: Command not found.\n", argv[0]);
exit(0);
}
}

if (!bg)
{ /* parent waits for fg job to terminate */
int status;


if (waitpid(pid, &status, 0) < 0)
unix_error("waitfg: waitpid error");
}
else /* otherwise, don’t wait for bg job */
{
printf("%d %s", pid, cmdline);
}
}

return;
}

现在,当我运行后台作业时,我希望作业的 pid 打印两次,一次在父级中,一次在子级中。我只需要了解代码中发生了什么。它按照预期的方式工作,但为什么呢?

最佳答案

父级和子级都从fork返回,但条件== 0仅对子级成立:

if ((pid = fork()) == 0)

因此只有 child 运行这个:

    if (execve(argv[0], argv, environ) < 0)

execve 替换当前进程,因此如果没有错误则不会返回,即子程序的执行在此处结束或在 exit(0); 由错误条件得出。

在所有情况下,函数的其余部分仅由父级运行。

关于创建 UNIX Shell,对 fork 和 child pid 感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com