C语言 创建一个 UNIX Shell,对 fork 和子 pid 感到困惑



这是我的评估函数的代码,它在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)

因此,只有子级运行以下命令:

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

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

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

最新更新