2012-09-17 4 views
-2

운영체제에 대한 책을 읽었으며 C 프로그래밍에 익숙하지 않은 것 (복잡하게하는 경향이 있음)은 왜 모든 자식이 증가 할 때 증가 된 i 값을 인쇄 할 수 없는지 궁금합니다. fork()를 통해 생성됩니다. 자식 프로세스 또는 다른 것과 관련이 있습니까? 미리 감사드립니다. 부모와 자식 프로세스 ID에 대한Fork 후 자식 번호 인쇄()

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

int main() 
{ 
    pid_t pid; 
    int i = 1; 

    pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    pid = fork(); 

    if (pid == 0) { 
     printf("got child %d\n", i); 
     i++; 
    } 
} 
+0

출력 하시겠습니까? 무엇이 출력됩니까? – ecatmur

+0

나는 산란 된 양을보고 싶었습니다. 그리고 저는 왜 그것이 지금이 방식으로 작동하지 않는지 이해하고 있다고 생각합니다. – wazy

답변

1

i이 증가 된 후에 인쇄되지 않으므로 증가 된 값을 인쇄 할 수 없습니다. fork()으로 분할 된 프로세스는 리소스를 공유하지 않으므로 각각 i이라는 독립된 복사본을 얻습니다. 그러면 다음과 같이 표시됩니다.

got child 1 

계속해서 표시됩니다. 이 팅겨을 시도하고 당신은 자식 프로세스의 각이 동일한 값 조건에 얻고있는 것을 볼 수 있습니다 :

int main() { 
    pid_t pid; 
    int i = 1; 
    pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    pid = fork(); 
    if (pid == 0) { 
    printf("the child %d, got %d\n", getpid(), i); 
    i++; 
    } 
} 
+0

이것은 실제로 내 질문에 대한 답변입니다. 감사합니다. – wazy

2

사용 getpid()getppid().

[04mca8의 @ 상인방의 PP] $ ./a.out 헬로 포크 전에 : 134,514,088

어린이가 시작

here

int main() 
{ 

     int i; 
     printf("hello before fork \n"); 
     printf("i : %d\n",i); 

     i=fork(); 
     printf("\n"); 

     if(i==0) 
     { 

       printf("Child has started\n\n"); 
       printf("child printing first time \n"); 

       printf("getpid : %d getppid : %d \n",getpid(),getppid()); 
       sleep(5); 
       printf("\nchild printing second time \n"); 
       printf("getpid : %d getppid : %d \n",getpid(),getppid()); 
     } 
     else 
     { 
       printf("parent has started\n"); 
       printf("getpid : %d getppid : %d \n",getpid(),getppid()); 
       printf("\n"); 

     } 

     printf("Hi after fork i : %d\n",i); 

     return 0; 


} 

출력

하위 인쇄 처음으로 getpid : 8354 getppid : 8353

부모 GETPID 시작 : 8353 getppid : 5656 하이 포크 후 제가

: 8354 [04mca8 @ 상인방의 PP] $ 자식 번째 인쇄 GETPID : 8354 getppid 1 하이 후 포크 I : 0

+0

도움이되는 예제 링크를 제공해 주셔서 감사합니다. – wazy

1

각 부모/자녀가 메모리에 대한 별도의 스택을 가지고, 각각의 자신을 얻을 것이다 버전이 설정된 i입니다. 따라서 printf은 1, 즉 16 개를 인쇄합니다.

getpidgetppid을 사용하십시오.

+0

실제로 8 번 인쇄합니다. – wazy

1

코드가 전혀 이해가되지 않습니다.

  1. fork()을 호출 할 때마다 새로운 프로세스가 만들어집니다.
  2. 두 프로세스 각각은 fork() 다음의 지점에서 계속 실행됩니다.
  3. 즉, 두 번째 fork()두 개의 프로세스에 의해 호출됩니다. 최초의 자식과 최초의 자식에 의해 생성 된 자식 fork().
  4. 등등.
  5. 당신은 pid을 여러 번 무리를 덮어 쓰기 한 다음 당신은하지 pidi을 인쇄 0
  6. 을 위해 그것을 확인하고 아무런 영향을주지 않을 것이다, 그것은 인쇄 후 그것을 를 증가.

이러한 것들을 더 공부하십시오. 다소 혼란 스러울 것입니다.

+0

나는 약간의 대답 후에 나는 약간의 진도를 만들었다라고 생각하고, 이해할 것을 부탁하고 있었다. – wazy