2017-02-01 1 views
4

텍스트가 8 번 인쇄되는 이유를 이해할 수 없습니다. 제 생각에 그것은 단지 2 번 인쇄됩니다. 아무도 도와 줄 수 있습니까?누군가이 포크 실행이 왜 내 텍스트를 8 번 인쇄하는지 설명 할 수 있습니까?

코드 :

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    pid_t x=0; 
    pid_t y=0; 
    x=fork(); 
    if(y>0) 
     fork(); 
    if(x==0) 
     y=fork(); 
    fork(); 
    if(y==0){ 
     fork(); 
     printf("Some text\n"); 
    } 
} 
+1

두 번만, 그 많은 포크 전화! 제어 흐름을 추적하기 위해'printf'를 추가하려고 했습니까? –

+1

이것은 학교 과제물처럼 보입니다. 이 질문의 목적은 무엇입니까? – manishg

+0

네, 학교 과제입니다. 텍스트가 인쇄 된 횟수를 확인해야합니다. –

답변

4

x = fork();을 실행하고이 개 프로세스가 실행된다.

if (y>0) fork();은 절대로 실행되지 않습니다.

if (x==0) y=fork();은 하위 프로세스에서 실행되므로 3 개의 프로세스가 실행 중입니다. 초기 부모의 경우 y은 여전히 ​​0입니다. 어린이는 y == child_child's pid이고 어린이는 y==0입니다.

3 개의 프로세스 모두 fork()을 실행하므로 총 6 개의 프로세스가 있으며 그 중 4 개는 메모리에 y==0이 있습니다.

다시이 4 개 프로세스 포크

,이 8 개 프로세스입니다 그들은 printf(...);

+0

ok elikatsis, 나는 각 프로세스가 0 값을 갖는 자체 변수 y를 가지고 있다는 것을 몰랐다. 그것은 혼란이었다. 고맙습니다. –

+0

fork 된 모든 프로세스는 fork 실행 전에 바로 부모 메모리의 사본을 얻습니다! :-) – elikatsis

1

좀 더 디버깅 출력을 가지고 코드를 수정하는 것이 실행할 수 있도록. 여기

#include <stdio.h> 
#include <stdlib.h> 
#include "unistd.h" 
int main() { 
    pid_t x=0; 
    pid_t y=0; 

    printf("FORK X \n"); 
    x=fork(); 

    if(y>0) { 
     printf("FORK 1 \n"); 
     fork(); 
    } 

    if(x==0) { 
     printf("FORK 2 \n"); 
     y=fork(); 
    } 

    printf("FORK 3 \n"); 
    fork(); 
    if(y==0){ 
     printf("FORK 4 \n"); 
     fork(); 
     printf("Some text\n"); 
    } 
} 

출력, 그리고 모든 이후 포크가 있기 때문에 두 "일부 텍스트"됩니다 "FORK 4"

팬케이크 : tmp를 greedy52 $

FORK X 
FORK 3 
FORK 4 
FORK 2 
FORK 4 
Some text 
Some text 
FORK 3 
FORK 3 
Some text 
Some text 
FORK 4 
Some text 
FORK 4 
Some text 
Some text 
Some text 

./a.out을

4 "FORK 4"에 의해 도달된다 (각 성공적인 포크()를 호출하는 두 개의 공정 A 및 B 작성)

  1. @ X = 포크() -> X = 0 @FORK 3 포크! Ax = 0 및 @FORK 3 포크 B
  2. @ x = fork() -> x = 0 및 @ y = fork() -> y = 0 및 @FORK 3 포크
  3. @ X = 포크() -> X = 0 @ Y = 포크() -> Y = 0 @FORK 3 포크 B

에서 @ X = 포크() -> x = 0 및 @ y = fork() -> y! = 0 분기는 "일부 텍스트"를 생성하지 않습니다.

FORK X --------> x != 0 -------------------------------> FORK 3 A -----> FORK 4 A (Some text) 
      |    |           |--> FORK 4 B (Some text) 
      |    | 
      |    |-----------------------------> FORK 3 B -----> FORK 4 A (Some text) 
      |               |--> FORK 4 B (Some text) 
      | 
      | 
      |----> x == 0 -----> FORK 2 A (y = 0) -----> FORK 3 A -----> FORK 4 A (Some text) 
         |           |--> FORK 4 B (Some text) 
         |       |---> FORK 3 B -----> FORK 4 A (Some text) 
         |           |--> FORK 4 B (Some text) 
         | 
         |---> FORK 2 B (y != 0) -----> FORK 3 A -----> XXX bad end 
                |---> FORK 3 B -----> XXX bad end 
+0

와우. 그것이 지금까지 최고의 설명입니다. 정말 고맙습니다. –

관련 문제