2014-02-25 2 views
3

간단한 조각 : 포크에 대한 이해에서main 내부에서 fork()를 호출하면 어떻게됩니까? 코드의

#include <stdio.h> 
#include <string.h> 

main() 
{ 
    printf("Process"); 
    fork(); 
    fork(); 
    return 0; 
} 

(),이 코드는 우리가 3 개 하위 프로세스 및 한 부모 프로세스가됩니다 실행 후. 또한 fork()를 호출 할 때마다 실행은 fork() 문 바로 다음의 명령문에서 시작해야합니다. 그러므로 나를 따라 "프로세스" 한 번만 인쇄해야합니다. 하지만 내 출력에서 ​​ 프로세스 4 번 인쇄되고 있습니다. 어떻게 가능합니까?

+0

예 있도록. 이걸 지우거나 그대로 두어야합니까? – bigbong

답변

10

표준 출력은 기본적으로 줄 버퍼이므로 fork()을 호출하면 출력 버퍼가 모든 하위 프로세스에 상속됩니다.

printf("Process"); 
fflush(stdout); 

나 : 출력을 플러시

printf("Process\n"); 

또는 fflush()를 호출 끝에 새 줄 문자를 추가

:

이 동작을 변경할 수있는 여러 가지 방법이 있습니다 setbuf() or setvbuf()을 사용하여 표준 출력을 버퍼링하지 않음으로 변경하십시오.

setbuf(stdout, NULL); 
printf("Process"); 

두 가지 방법 중 하나를 사용하면 출력이 한 번만 표시됩니다.

참고 : atexit() 코드를 여러 번 호출하는 버그는 @Dvaid Schwartz's answer을 참조하십시오.

+4

이것은 실제로 버그를 수정하지 않습니다. 코드를 "잘못된 일을 일으키는 끔찍한 버그"에서 "행운에 해를 입히지 않는 끔찍한 버그"로 바꿉니다. 그의 결과를 설명하지만 근본적인 문제 (atexit 핸들러가 4 번 실행 됨)가 아니라 기본 문제를 해결하는 방법을 알려줍니다. –

+0

오케이. 이것에 대해 알지 못했습니다. 고맙습니다! – bigbong

4

프로그램에 버그가 있습니다. 모두 어린이가 main에서 돌아오고 atexit 처리기가 네 번 실행됩니다. 아이들은 _exit으로 전화해야합니다.

여기에 코드가 보일 것입니다 방법은 다음과 같습니다 보인다

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

main() 
{ 
    int is_child = 0; 
    printf("Process"); 

    if (fork() == 0) 
     is_child = 1; 

    if (fork() == 0) 
     is_child = 1; 

    if (is_child) 
     _exit(0); 

    return 0; 
} 
+0

그리고 아이가 stdout에 무엇인가를 인쇄해야한다면 ... – user3125367

+2

알겠습니다. 이런 종류의 버그는 어떤 종류의 악영향을 일으킬 수 있습니까? – bigbong

+0

그런 핸들러를 반복해서 호출하는 것이 왜 그렇게 나쁜지 설명 할 수 있습니까? –

관련 문제