파일 생성해서 쓰고 읽을 시, 쓰거나 읽을 내용은 메모리에 버퍼 되나요?
fopen 해서 파일을 읽게 되면, disk 상에서 File * 포인터 주소에서부터 순차적으로 연속된 메모리 배열로 존재하게 되는 것이고,
파일을 쓰게 되면 쓰는 내용들에 메모리 버퍼에 순차적으로 쌓이다가 fclose 하는 순간 disk 공간으로 flush 되는 건가요? 이때 커널의 i/o 드라이버와 HDD or SSD의 디스크 컨트롤러가 동작하는 구조인 것이고요?
추가로, fclose 함수는 blocking 방식으로 동작하는 함수 인지 알고 싶습니다.
답변 1
0
close되는 순간이 아니라 Flush하는 순간에 반영(Commit) 됩니다. 보통 파일을 닫기 전에 알아서 Flush가 되기는 합니다. 그리고 fclose() 함수는 블로킹 방식이 맞습니다. 그리고 좀 더 정확히는 파일 자체가 애초에 비동기 입/출력을 지원하는지에 따라 Blocking/Non-blocking 입/출력 가능 여부가 달라집니다.
0
#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





