해결된 질문
작성
·
422
0
fopen 해서 파일을 읽게 되면, disk 상에서 File * 포인터 주소에서부터 순차적으로 연속된 메모리 배열로 존재하게 되는 것이고,
파일을 쓰게 되면 쓰는 내용들에 메모리 버퍼에 순차적으로 쌓이다가 fclose 하는 순간 disk 공간으로 flush 되는 건가요? 이때 커널의 i/o 드라이버와 HDD or SSD의 디스크 컨트롤러가 동작하는 구조인 것이고요?
추가로, fclose 함수는 blocking 방식으로 동작하는 함수 인지 알고 싶습니다.
답변 1
0
close되는 순간이 아니라 Flush하는 순간에 반영(Commit) 됩니다. 보통 파일을 닫기 전에 알아서 Flush가 되기는 합니다. 그리고 fclose() 함수는 블로킹 방식이 맞습니다. 그리고 좀 더 정확히는 파일 자체가 애초에 비동기 입/출력을 지원하는지에 따라 Blocking/Non-blocking 입/출력 가능 여부가 달라집니다.
이 코드에서는 fclose()만 확실하게 Flush됩니다. fputs() 함수가 Flush까지 보장하지는 않습니다. 다만 5회 반복 중 1~3번은 버퍼링 됐다가 4번째 출력에서 모두 몰려 Flush되는 것 같은 현상은 있을 수 있습니다. 이는 운영체제 상황에 따라 달라질 수 있습니다.
#define CRTSECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* fp = fopen("test.txt","w"); //test파일을 w(쓰기) 모드로 열기
for (int i = 0; i < 5; i++)
{ fputs("test\n",fp); //문자열 입력 }
fputs("end", fp);
fclose(fp); //파일 포인터 닫기
return 0;
}
해당 코드에서 어느 시점에 flush가 되는지 알 수 있을까요?
(파일을 읽고 쓸 때 그 내용들이 메모리에 버퍼가 되는게 맞는지도 알고 싶습니다)