0
다음은 main에서 호출되는 evaluate 함수에 대한 코드입니다. 내가 백그라운드 작업을 실행할 때포크 및 하위 pids에 대해 혼동하는 UNIX 셸 만들기?
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를 한 번 부모에 한 번 그 아이에 대한 그냥 코드에서 무슨 일이 일어나고 있는지 이해하는 데 필요한 두 번 두 번 인쇄 얻을 것으로 기대합니다. 그것은 그것이 예정된 방식대로 작동하지만 왜 작동합니까?
그러나 왜 어린이는 특정 부분 만 실행합니까? 두 프로세스를 똑같이 복제하지 않습니까? – user3213348
@ user3213348 자식 만'fork'에서'0'을 반환하기 때문에'if ((pid = fork()) == 0)'에서 분리됩니다. 'execve'는 자식이 그'if' 문에서 벗어나지 못하게합니다. – Arkku
고마워요. 지금 이해합니다. – user3213348