这是我的评估函数的代码,它在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);
结束。
在所有情况下,函数的其余部分仅由父级运行。