2014-02-24 2 views
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를 한 번 부모에 한 번 그 아이에 대한 그냥 코드에서 무슨 일이 일어나고 있는지 이해하는 데 필요한 두 번 두 번 인쇄 얻을 것으로 기대합니다. 그것은 그것이 예정된 방식대로 작동하지만 왜 작동합니까?

답변

1

부모와 자식 fork에서 복귀하지만, 조건 == 0 만 아이를 위해 사실 인 양 :

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

는 따라서 만 아동이 실행됩니다

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

execve는 현재 프로세스를 대체 , 따라서 오류가 없으면 반환하지 않습니다. 즉,이 프로그램의 자식 실행이 여기 또는 오류 조건에서 다음에 오는 exit(0);으로 끝납니다.

나머지 함수는 모든 경우에 부모에 의해서만 실행됩니다.

+0

그러나 왜 어린이는 특정 부분 만 실행합니까? 두 프로세스를 똑같이 복제하지 않습니까? – user3213348

+0

@ user3213348 자식 만'fork'에서'0'을 반환하기 때문에'if ((pid = fork()) == 0)'에서 분리됩니다. 'execve'는 자식이 그'if' 문에서 벗어나지 못하게합니다. – Arkku

+0

고마워요. 지금 이해합니다. – user3213348