-
반응형
시스템은 기본입출력인 stdin,stdout, stderr가 있다. stdin과 stdout은 해당 내용이 즉시 반영되지 않고 버퍼(linux에서는 4k)에 저장되었다가, 조건에 의해서 read 혹은 write한다.
얼마전에 stdout buffer 때문에 프로그램이 의도치 않게 행동하여 애를 먹은적이 있다.
FILE *fp = fopen("test.log","w"); for( int i=0; i < 10; i++) { fprintf(fp,"1"); sleep(1); } fclose(fp);
코드의 의도는 test.log라는 file에 "1"을 1초씩 쉬면서 10번 쓰는겁니다. 하지만 write의 내용은 버퍼링 되기 때문에, 바로 적히지 않고 10초 뒤에 한번에 10번 쓰여진다. 파일이 닫힐 때 버퍼를 비우기 때문에 나중에 한번이 이루어지게 된 것이다. 버퍼를 비우는 조건은 다음과 같이 정리할 수 있다.
1) \n : nextline을 만나면 buffer를 비운다.
2) close: 열려진 fd를 닫으면 buffer를 비운다.
3) fflush : buffer의 내용을 강제로 비운다.
4) buffer full : buffer의 크기가 가득차면 비운다.
이번 경우에는 3번으로 해결하였다. 대부분 fflush를 통해서 해결된다.
사실 이야기하고자 하는 바는 libc라이브러리를 사용하는 함수들 중에서 버퍼링을 사용하는 함수들에 대해서 유의해야 한다는 것을 말하고 싶었다.
man 페이지를 참고하면 버퍼를 사용하는지 알 수 있다.
반응형