입출력 버퍼링(IO buffering)은 표준 라이브러리(stdio)가 처음 등장한 이후 C 언어에 존재했습니다. 이는 파일 시스템이나 장치에 대한 접근이 시간적으로 비싼 작업이기 때문에 읽기 및 쓰기 작업의 성능을 향상시키기 위해 도입되었습니다.
버퍼링 작동 방식을 이해하지 못하면 입력 및 출력에서 예기치 않은 지연이 발생할 수 있으며, 프로그램이 비정상 종료될 때 데이터 손실, 여러 스레드(특히 stdout/stderr) 사용 시 오류, 프로세스나 시스템 간의 동기화 오류 등이 발생할 수 있습니다.
파일 스트림이 버퍼링될 수 있다는 것을 이해하고, 버퍼를 강제로 플러시하는 함수(fflush()), 파일을 정확히 닫는 것(fclose()), stdin, stdout 및 stderr 작업을 적절히 조합하는 것이 중요합니다. 또한 버퍼링은 스트림 유형에 따라 달라집니다(예: stdout 스트림은 터미널과 연결된 스트림에서 문자가 출력되면 플러시되지만, 파일에서는 항상 그렇지 않습니다).
코드 예제:
#include <stdio.h> int main() { printf("Hello"); // sleep(10); // fflush가 실행될 때까지 출력되지 않음 fflush(stdout); // 즉시 출력 버퍼를 화면에 표시 return 0; }
주요 특징:
fflush()는 수동으로 버퍼를 플러시하는 주요 도구printf의 출력이 즉시 화면에 나타날 것이라고 믿어도 되나요?
아니요, 출력이 터미널이 아닌 파일로 이어지는 경우, 버퍼가 플러시될 때까지 строки 는 나타나지 않을 수 있습니다. 터미널에서도 없는 문자열은 즉시 표시되지 않을 수 있습니다. 즉각적인 출력을 위해 fflush(stdout); 를 사용하세요.
fflush(stdin)을 호출하면 무엇이 발생하나요?
이는 C 표준에 따라 정의되지 않은 동작입니다. 일부 컴파일러/플랫폼은 입력 스트림의 버퍼를 비울 수 있지만, 표준에서 보장되지 않으며, 이는 이식성이 떨어지고 잠재적으로 위험합니다.
printf와 fprintf(stderr, ...)를 즉각적인 출력에 대해 동등하다고 간주할 수 있나요?
아니요. 표준 출력(stdout)은 일반적으로 완전하거나 라인 단위로 버퍼링되며, stderr는 표준에 따라 항상 비버퍼링됩니다. 즉, stderr로의 출력은 즉시 화면에 나타나지만 stdout으로의 출력은 그렇지 않습니다.
fflush(stdin) 사용프로그램이 printf를 통해 로그 파일을 작성하지만 fflush(stdout)를 호출하지 않고 비정상 종료 시 파일을 닫지 않습니다.
장점:
단점:
프로그램은 중요한 로그 기록 후마다 fflush(stdout)를 호출하거나 중요한 메시지를 stderr에 기록합니다.
장점:
단점: