2014-04-26 5 views
0

그래서 아래 코드에 대한 내 결과물에는 D를 두 번 인쇄하는 것이 포함되어 있는데 그 이유를 이해할 수 없습니다. 누군가가 나에게 설명 할 수 있다면 좋을 것이다.포크와 printf()

int main() { 
    int r = fork(); 
    printf("B\n"); 
    int t = fork(); 
    printf("C\n"); 
    if(r == 0) { 
     printf("D\n"); 
    } else if (r > 0 && t == 0){ 
     printf("E\n"); 
    } 
    printf("F\n"); 
    return 0; 
} 

감사합니다.

+1

처음'fork()'가 자식을 생성했습니다. 두 번째'fork()'는 부모로부터 자식을 만들고 첫 자식 (자식)에서 자식을 생성했습니다. 부모 프로세스는'r> 0'을 가지므로'D'를 출력하지 않습니다. 다른 아이를 포크하는 자식 프로세스는 둘 중 하나만 t == 0이 되겠지만'r == 0 '을 갖습니다. 요약하자면, 원래의 자녀와 손주는 모두'D'를 인쇄했습니다. – alvits

답변

1

명명 규칙을 사용하여 코드 실행 방법을 쉽게 설명해 보겠습니다. X=fork()Xparent 및 분기 된 자식 Xchild을 실행하는 부모를 호출 해 봅시다. 부모는 X > 0으로 끝나고 자식은 X==0이됩니다.

r=fork()t=fork()을 실행하는 부모가있어 Rparent 및 Tparent가됩니다.

이제 Rchild는 r==0이고 Tchild는 t==0이 될 것입니다.

그러나 더 오래된 자식 인 Rchild는 t=fork()을 실행하여이를 Tarent로 만들고 Tchild를 분기합니다.

Rchild에서 포크로 찍힌 Tchild는 r==0이고 부모 및 자식의 메모리는 복제됩니다.

따라서 과 그 자식이 r==0 인 Rchild로 끝납니다. 두 프로세스 인쇄 D.