2017-10-28 9 views
0

this post에서 Kaylum의 대답을 이해하지 못합니다. 두 가지 질문이 있습니다.WEXITSTATUS를 사용하여 fork() 호출에서 총 프로세스 양 검색

1) "count"변수를 사용하여 생성 된 총 프로세스 수 (즉, 손자 손자 + 원래 프로세스의 총 수)를 포크에서 계산하려고합니다. 나는 S/he가 부모 프로세스에서 count를 1로 설정함으로써 시작한다는 것을 알지만 (부모를 세는 것이 합리적 임) S/he는 자식에서 다시 count를 1로 설정합니다. 왜 이것이 의미가 있습니까? 카운트가 이미 1로 설정되어 있고 카운트가 1로 다시 설정됩니다.

count += WEXITSTATUS(status); 

2) 나는 WEXITSTATUS를 조사해 왔으며 수집 할 수있는 것으로부터 출구를 통해 프로세스의 종료 상태를 반환합니다. 내 질문은 내가 사용해야 할 것입니다

exit(0) 

또는

exit(1) 

하거나 작업을 위해 뭔가. 이 문서는 명확하지 않습니다. 즉 그것은 편의를 위해 여기 Kaylum의

전체 코드 세그먼트로 작동하려면 :

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t before_pid, after_pid; 
    pid_t forked_pid; 
    int count; 
    int i; 
    int status; 

    before_pid = getpid(); 
    count = 1; /* count self */ 
    for (i = 0; i < 3; i++) { 
     forked_pid = fork(); 

     if (forked_pid > 0) { 
      waitpid(forked_pid, &status, 0); 
      /* parent process - count child and descendents */ 
      count += WEXITSTATUS(status); 
    } else { 
     /* Child process - init with self count */ 
     count = 1; 
    } 
} 

after_pid = getpid(); 
if (after_pid == before_pid) { 
    printf("%d processes created\n", count); 
} 

return (count); 
} 
+0

Kaylum의 솔루션이 작동해야하지만 카운트시 255로 제한됩니다. 종료 코드의 최대 값은 255입니다. – benjarobin

+0

감사합니다. 이제 알겠습니다. 나는 그것의 제한된 255 잘 알고 있습니다. 나는 그 의견을 고맙게 생각한다. – EFiore

답변

1

I (즉 그 의미가 부모 프로세스 1로 카운트를 설정하여 시작합니다/S 참조 부모를 세지 만) S/he는 어린이들에게 다시 1로 세팅한다. 왜 이것이 의미가 있습니까? 카운트가 이미 1로 설정되어 있고 카운트가 1로 다시 설정됩니다.

그렇지 않으면 루프에서 생성 된 각 하위 프로세스의 count 값이 1보다 커질 수 있습니다. fork()현재 상태의 프로세스를 복제합니다. 따라서 루프에있는 fork()의 경우 count이 반드시 1 일 필요는 없습니다. count 값을 else 부분에 인쇄하면 쉽게 이해할 수 있습니다.

나는 WEXITSTATUS를 조사해 왔으며 수집 할 수있는 것으로부터 출구를 통해 프로세스의 종료 상태를 반환합니다. 내 질문은 내가 출구 (0) 또는 출구 (1) 사용해야합니까?

이것이 바로 return(count)입니다. main에서 돌아 오는 것은 exit을 호출하는 것과 같습니다. 즉 exit(count);입니다.

this answer은 상태를 exit() 상태로 전달합니다. exit status 값은 이전에는 8 비트 값으로 제한됩니다. 따라서 대부분의 플랫폼에서 i 값이 8보다 크면 예상대로 작동하지 않을 수 있습니다.

+0

감사합니다. 지금은 이해. 의견에 감사드립니다. – EFiore

+1

이 대답이 도움이 될 경우 [수락하는 것으로 간주하십시오] (https://meta.stackexchange.com/q/5234/362103). 행운을 빕니다! – usr