inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

파일 시스템 기본 이론

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

해결된 질문

502

imwoodam

작성한 질문수 3

0

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

 

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

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

c kernel file-system

답변 1

0

널널한 개발자

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

0

imwoodam

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

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

0

널널한 개발자

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

병행성 제어

0

46

2

질문이 있습니다(강의와 거의 상관이 없는)

0

75

2

컴파일러 서적 질문입니다

0

161

1

코드생성 및 최적화 질문입니다

0

159

1

Hex Editor를 이용한 다국어 번역 관련 질문입니다

0

209

2

큐의 배열을 넘겨도 정상작동합니다

0

157

2

캐너리비트에 관하여 질문

0

210

3

상수화된 문자열에 질문있습니다

0

171

1

함수 호출 매개변수 전달에 대한 질문 드립니다.

0

189

1

단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.

0

209

2

함수호출 규약 종류에 따른 장단점 여부

0

227

2

정적라이브러리 링크 오류

0

225

1

const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의

0

353

2

pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.

0

251

2

비선형 자료구조

0

311

1

자료 구조 공부 후에

0

353

1

강의자료 관련

0

253

1

마지막에 말씀하신 부분 질문드립니다.

0

213

1

문자열 관련 질문 드립니다

0

290

1

라이브러리

0

272

1

부동소수점

0

389

1

왜 변수 주소 사이에 offset이 있는 건가요?

0

301

2

stack 쌓는 순서

0

505

1

함수호출이랑 쓰레드

0

410

1