2012-02-19 4 views
1

이 다이어그램의 프로세스가 있으며 코드 소스를 사용해야합니다! 올바른코드 소스 Fork(), 다이어그램 프로세스

enter image description here

는이

a)

  #include <unistd.h> 
      int main(void) { 
      int i; 
      for (i= 0; i < 3; i++) 
      { 
      if(!fork()) 
      break; 
         } 

     while(wait(NULL) !==-1);//to avoid the appearance of zombies processes?? 

제 용액 B)에 대한 제 용액 있는지 확인하십시오

  #include <unistd.h> 
      int main(void) { 
      int i,pid; 
      for(i=0; i<3;i++) 
      { 
       pid=fork(); 
      if (pid>0) 
       break; 
         } 
      while(wait(NULL)!=-1); 

PS는 : 또 나는 내가 어디에 있는지를 나타내는 주석을 포함해야한다. 각각의 아이들을 실행할 ""exec ""를 포함시켜야합니다!

+0

왜 그렇게 많은 "!"와 "?"? 키보드에 문제가 있습니까? – cnicutar

+0

둘 다 잘못되었습니다. 두 버전 모두에서 자식 프로세스는 wait()를 호출합니다. 이는 원하는 것이 아닙니다. – wildplasser

답변

2

두 프로그램 모두에서 들여 쓰기를 합리화하고 끝 부분에 누락 된 대괄호를 포함시켜야합니다.

해결 방법 (a)는 다소 정확합니다. wait()waitpid()의 선택에 대해 논할 수 있으며 사용중인 대기 함수를 선언하려면 #include <sys/wait.h>이어야합니다. 당신은 exec()을 어디에서할지 명시하지 않았습니다. 즉, 0 세 어린이를 기다리는 하위 프로세스에 문제가 있는지 여부를 말할 수 없습니다. 이는 옳지 않은 일이지만 정확성에 영향을주지 않습니다. (if (fork() == 0)을 쓰고 싶습니다. 특히 034의 반환 값이 성공적으로 fork 된 것을 의미하기 때문에 !fork()보다 명확하다고 생각하기 때문에 !fork()은 '포크가 아닙니다'라는 메시지를 읽습니다. '포크하지 않았습니다.'를 쉽게 나타낼 수 있습니다.

exec()의 위치가 다를 경우를 제외하고는 (b) 해결 방법도 다소 정확합니다. fork()이 실패하면 루프를 조금 더 오래 실행하지만 다시는 주요 문제가되지는 않습니다 문제는 '프로세스가 어떻게 그것이 원래인지 아니면 어린이 중 하나인지 여부를 알 수있는 방법'일 것인가? 원래 프로세스와 다양한 어린이를 구별하는 데 필요한 제어 정보를 보여주지 않았으며, 셋업 할 파이프가 있다면 아무 것도 표시되지 않습니다.

관련 문제