2016-06-29 7 views
2

이 질문은 A의 C에서 다음 코드를 실행 한 후 인쇄 할 얼마나 많은에 대해 aked되었다 포크() 명령

int i; 
for (i=1;i<4;i++){ 
    fork(); 
    printf("A"); 
} 

내가 내 자신에 14 세었다.

int i; 
for (i=1;i<4;i++){ 
     fork(); 
     printf("A\n"); 
} 

(14)의 인쇄 : 그러나, 그것을 실행 한 후 asnwer는 24 나중에 내가 변경된 버전을 실행으로 밝혀졌다. 나는 이것을 설명 할 누군가를 사랑한다.

+0

'fork()'의 반환 값을 확인하지 않으므로 최대 프로세스 수를 초과했다고 가정 할 것입니다. – marcolz

답변

6

A 수가 다른 이유는 라인 버퍼링 때문입니다.

첫 번째 버전은 개행 문자를 인쇄하지 않으므로 printf는 프로그램이 종료 될 때까지 실제로 쓰이지 않습니다.

fork() 호출은 실행중인 프로세스 전체를 복제하므로 A의 버퍼링 된 행을 복제합니다.

각 프로세스가 종료 될 때 버퍼를 플러시하여 출력합니다.

프로그램의 두 번째 버전은 개행과 모든 C 구현이 터미널에 인쇄 할 때 개행 할 때 버퍼를 플러시하기 때문에 printf 호출마다 출력을 플러시합니다. (파일이나 네트워크 소켓에 인쇄하는 경우는 세척하지 않습니다.)

+0

그래서 프로그램을 더 쉽게 만들 수있게하려면'printf'를 호출 할 때마다'fflush (stdout);을 호출하십시오. 이렇게하면 fork 할 때 프로세스의 표준 출력 버퍼에 아무 것도 남지 않습니다. 그렇다면 매번 14 점을 얻어야합니다. –

0

이것은 의 printf는 사실 때문에 발생 라인 버퍼 즉, 버퍼가가 발생할시에만 플러시됩니다, 새줄.

두 번째 경우에는 '\ n'을 넣었으므로 예상되는 동작은 버퍼가 지워질 때마다 발생합니다. 첫 번째 경우

,

후 제 포크() : 제 포크 후

Buffer : A 

() : 제 포크 후

Buffer : AA 

()

Buffer : AAA (3 A's exist in the buffer) 

이렇게 마침내 8 pr 그러므로 24 A의