创建一个UNIX Shell,对fork和child pids感到困惑?

时间:2014-02-24 00:02:57

标签: c shell unix systems-programming

这是我的evaluate函数的代码,在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打印两次,一次在父级,一次用于子级。我只需要了解代码中发生了什么。它按照预期的方式工作,但为什么呢?

1 个答案:

答案 0 :(得分:1)

父母和孩子都从fork返回,但条件== 0仅适用于孩子:

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

因此只有孩子才能这样做:

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

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

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