2016-12-20 14 views
1

이 코드 단편은 "XUVUV"문자 만 생성하는 이유는 무엇입니까? 나는 "UXUVV"도 가능성이 있다고 생각하지만, 나는 그 결과를 얻지 못한다.왜이 코드는 fork()가 하나의 출력만을 생성합니까?

if (fork() == 0){ 
    printf("X"); 
} 

printf("U"); 
wait(NULL); 
printf("V"); 
+0

버퍼링 중일 수 있습니다. 모든'printf'에 개행을 추가하면 대부분의 행 지향적 인 터미널 시스템에서 버퍼를 비 웁니다. printf ("X \ n");'(보통) unbuffered 인'stderr'에 쓰기를합니다. 'fprintf (stderr, "X");' – cdarke

+2

어떻게'UXUVV'가 발생한다고 생각하는지 설명 할 수 있습니까? –

+2

코드에서 하나 또는 다른 출력을 보장하는 것은 없습니다. 그래서 당신의 기대는 근거가 없습니다. 타이밍/스케줄러에 따라 다릅니다. 그리고 시스템에서 타이밍/스케줄러 동작은 다른 것보다 하나의 결과를 생성하는 경향이 있습니다. 그러나 다른 시스템 또는 다른 날에도 결과가 다를 수 있습니다. – kaylum

답변

4

인쇄 된 줄 바꿈이 없습니다. 따라서 프로세스가 종료 될 때까지 출력이 나타나지 않습니다.

하위 프로세스는 버퍼에 X을 추가합니다. 부모는 X을 인쇄하지 않습니다. 그런 다음 자식은 U을 버퍼에 추가합니다. 기다리지 만 대기는 즉시 반환됩니다. 아이는 기다릴 아이가 없습니다. 버퍼에 V을 추가합니다. 종료되므로 XUV이 비워집니다.

한편 부모는 버퍼에 U을 추가했습니다. 그 다음 아이가 끝나기를 기다린다. 어린이가 끝나면 XUV이 인쇄되었습니다. 부모는 V을 버퍼에 추가하고 종료합니다. 그 UV은 출력으로 플러시됩니다.

매번 XUVUV이 표시됩니다.

부모가 부모가 그 버퍼에 U을 추가하기 전후에 버퍼에 문자를 추가할지 여부는 알 수 없지만 부모가 V을 추가하기 전에 자식이 완료되었음을 알면 출력이 확실합니다. 어떤 출력 작업을하기 전에 표준 출력을 버퍼링하지 않으려면 setvbuf(stdout, 0, _IONBF, 0)과 같은 멋진 작업을 수행해야합니다.

각 인쇄 작업에 줄 바꿈을 추가하면 상황이 더욱 복잡해집니다. 타이밍은 결정적으로 중단됩니다.