这是我的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打印两次,一次在父级,一次用于子级。我只需要了解代码中发生了什么。它按照预期的方式工作,但为什么呢?
答案 0 :(得分:1)
父母和孩子都从fork
返回,但条件== 0
仅适用于孩子:
if ((pid = fork()) == 0)
因此只有孩子才能这样做:
if (execve(argv[0], argv, environ) < 0)
execve
替换当前进程,因此如果没有错误则不返回,即子程序执行此程序在此处或在错误条件之后的exit(0);
处结束。
在所有情况下,函数的其余部分仅由父项运行。