printf 문이 이상한 건지 sleep이 이상한 건지...
글쓴이: dalant019 / 작성시간: 수, 2006/04/26 - 11:38오후
#include
#include
int main()
{
while(1)
{
printf("hello world");
sleep(1);
}
}
위의 프로그램을 데비안에서 실행하니 멈추네요. ^^
#include
#include
int main()
{
while(1)
{
printf("hello world\n"); //개행 문자 추가
sleep(1);
}
}
이렇게 바꾸니깐 동작합니다.
음... 이걸 어떻게 해석해야 할까요?
1. printf문의 실행으로 응용은 멈추고 화면에 출력하기 위해 커널 모드로 진입
2. 커널은 출력장치에 "hello world"를 출력해달라고 요청 한뒤 다음 프로세스를 스케줄링
3. 스케줄링 할 응용이 없음으로(아직 이 응용은 printf 문을 완료하지 못 했음) 아이들 프로세스를 실행
4. 화면 출력이 끝났다는 인터럽트 도착 후 이 응용이 실행 상태가 되어 스케줄링 됨
5. 이 응용의 sleep함수가 호출됨
제 머리로는 위와 같은 시나리오만 생각이 되네요...
4번이 문제인 것 같은데... printf가 버퍼링을 하고 있다는 이야기가 되는데... 아~ 모르겠다~ 고수님들 도와주세요~~~
피에스 : 이 이유를 찾는데 거의 2시간 허비했습니다~ 이론 삽질 싫어~~~
Forums:
자문 자답~ 참을성 있게 기다리니(이글을 쓰고 있는 동안) 출력이 되네요~
맞는지는 확실히 모르겠지만
버퍼링이 때문인 것 같습니다. 1024의 버퍼를 가지고 있는 것 같네요~
음... 버퍼링만 한 뒤 printf 문을 종료하는 것 같네요. 왜 그러거지~ 성능(속도) 상의 이유인 것 같은데요~
잘못하면 디버그 할 때 출력문을 남발하다 보면 웬지 꼬일 수 있을 것 같네요~
아직 미심쩍어요~ 고수님들이 맞는지 확실히 짚어 주시면 감사하겠습니다.~~~
네 버퍼링 문제 입니다.
짐작하신대로
사실 두 소스 코드 모두 작동을 잘 하고 있습니다.
다만 처음 코드는 printf 가 화면에 출력을 하지 않고
계속 버퍼에 쌓아 두고만 있기 때문에 화면에 출력되는 결과가
없을뿐 계속 작동하고 있는 것이지요.
아주~ 오래 동작 시켜 놓으면 버퍼가 차서 자동으로
flush 될때 화면에 hello world 를 무쟈게 많이 보실 수 있을거에요.
그런데 printf 의 특징중 하나로
개행문자를 만나면 그 즉시 버퍼의 내용을 화면에 출력합니다.
그렇기 때문애 두번째 코드에서는 hello world 를 바로 바로
볼 수가 있는 것이지요.
처음 코드의 printf 다음에
fflush(stdout); 으로 강제로 버퍼를 비우게 하면
원하시는 결과가 나올 듯 하네요.
이렇게 하는 이유는 퍼포먼스 때문인데요
남발한다고 해도 내용이 꼬이지는 않습니다.
printf의 특징이라기
printf의 특징이라기 보다는 stdout의 버퍼링이 기본적으로 라인 버퍼링으로 되어 있기 때문입니다. 참고로 setvbuf 함수를 이용해서 버퍼링을 바꿀 수 있습니다.
댓글 달기