인프런 커뮤니티 질문&답변

imwoodam님의 프로필 이미지

작성한 질문수

독하게 되새기는 C 프로그래밍

파일 시스템 기본 이론

파일 생성해서 쓰고 읽을 시, 쓰거나 읽을 내용은 메모리에 버퍼 되나요?

해결된 질문

작성

·

410

0

fopen 해서 파일을 읽게 되면, disk 상에서 File * 포인터 주소에서부터 순차적으로 연속된 메모리 배열로 존재하게 되는 것이고,

 

파일을 쓰게 되면 쓰는 내용들에 메모리 버퍼에 순차적으로 쌓이다가 fclose 하는 순간 disk 공간으로 flush 되는 건가요? 이때 커널의 i/o 드라이버와 HDD or SSD의 디스크 컨트롤러가 동작하는 구조인 것이고요?

추가로, fclose 함수는 blocking 방식으로 동작하는 함수 인지 알고 싶습니다.

답변 1

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

2023. 03. 24. 00:16

close되는 순간이 아니라 Flush하는 순간에 반영(Commit) 됩니다. 보통 파일을 닫기 전에 알아서 Flush가 되기는 합니다. 그리고 fclose() 함수는 블로킹 방식이 맞습니다. 그리고 좀 더 정확히는 파일 자체가 애초에 비동기 입/출력을 지원하는지에 따라 Blocking/Non-blocking 입/출력 가능 여부가 달라집니다.

imwoodam님의 프로필 이미지
imwoodam
질문자

2023. 03. 24. 00:20

#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가 되는지 알 수 있을까요?

(파일을 읽고 쓸 때 그 내용들이 메모리에 버퍼가 되는게 맞는지도 알고 싶습니다)

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

2023. 03. 24. 00:24

이 코드에서는 fclose()만 확실하게 Flush됩니다. fputs() 함수가 Flush까지 보장하지는 않습니다. 다만 5회 반복 중 1~3번은 버퍼링 됐다가 4번째 출력에서 모두 몰려 Flush되는 것 같은 현상은 있을 수 있습니다. 이는 운영체제 상황에 따라 달라질 수 있습니다.

imwoodam님의 프로필 이미지

작성한 질문수

질문하기