이 코드 단편은 "XUVUV"문자 만 생성하는 이유는 무엇입니까? 나는 "UXUVV"도 가능성이 있다고 생각하지만, 나는 그 결과를 얻지 못한다.왜이 코드는 fork()가 하나의 출력만을 생성합니까?
if (fork() == 0){
printf("X");
}
printf("U");
wait(NULL);
printf("V");
이 코드 단편은 "XUVUV"문자 만 생성하는 이유는 무엇입니까? 나는 "UXUVV"도 가능성이 있다고 생각하지만, 나는 그 결과를 얻지 못한다.왜이 코드는 fork()가 하나의 출력만을 생성합니까?
if (fork() == 0){
printf("X");
}
printf("U");
wait(NULL);
printf("V");
인쇄 된 줄 바꿈이 없습니다. 따라서 프로세스가 종료 될 때까지 출력이 나타나지 않습니다.
하위 프로세스는 버퍼에 X
을 추가합니다. 부모는 X
을 인쇄하지 않습니다. 그런 다음 자식은 U
을 버퍼에 추가합니다. 기다리지 만 대기는 즉시 반환됩니다. 아이는 기다릴 아이가 없습니다. 버퍼에 V
을 추가합니다. 종료되므로 XUV
이 비워집니다.
한편 부모는 버퍼에 U
을 추가했습니다. 그 다음 아이가 끝나기를 기다린다. 어린이가 끝나면 XUV
이 인쇄되었습니다. 부모는 V
을 버퍼에 추가하고 종료합니다. 그 UV
은 출력으로 플러시됩니다.
매번 XUVUV
이 표시됩니다.
부모가 부모가 그 버퍼에 U
을 추가하기 전후에 버퍼에 문자를 추가할지 여부는 알 수 없지만 부모가 V
을 추가하기 전에 자식이 완료되었음을 알면 출력이 확실합니다. 어떤 출력 작업을하기 전에 표준 출력을 버퍼링하지 않으려면 setvbuf(stdout, 0, _IONBF, 0)
과 같은 멋진 작업을 수행해야합니다.
각 인쇄 작업에 줄 바꿈을 추가하면 상황이 더욱 복잡해집니다. 타이밍은 결정적으로 중단됩니다.
버퍼링 중일 수 있습니다. 모든'printf'에 개행을 추가하면 대부분의 행 지향적 인 터미널 시스템에서 버퍼를 비 웁니다. printf ("X \ n");'(보통) unbuffered 인'stderr'에 쓰기를합니다. 'fprintf (stderr, "X");' – cdarke
어떻게'UXUVV'가 발생한다고 생각하는지 설명 할 수 있습니까? –
코드에서 하나 또는 다른 출력을 보장하는 것은 없습니다. 그래서 당신의 기대는 근거가 없습니다. 타이밍/스케줄러에 따라 다릅니다. 그리고 시스템에서 타이밍/스케줄러 동작은 다른 것보다 하나의 결과를 생성하는 경향이 있습니다. 그러나 다른 시스템 또는 다른 날에도 결과가 다를 수 있습니다. – kaylum