일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- linux
- github
- Intel
- Samsung
- USENIX
- Git
- hardware
- Cache
- performance
- 커널 프로그래밍
- memory
- 키워드
- Operating System
- Machine Learning
- 포트 번호 변경
- rocksdb
- storage system
- Flash Memory
- kernel
- FTL
- overflow
- framework
- core dumped
- 시스템 소프트웨어
- deep learning
- ssd
- software
- 시스템 프로그래밍
- Today
- Total
Happy to visit my research note ^^
내가 쓰는 파일 입출력에 대한 간단한 정리 본문

저자는 linux kernel에서 각 layer간의 latency를 측정할 때, printf 혹은 printk로 인한 overhead를 최대한 출이기 위해 buffer에 기록 후 일정 크기가 차면 지정 file로 log들을 flush해주는 프로그래밍을 하였다.
모든 연구에서는 성능을 개발하기 전에 정확한 측정이 먼저 되어야하는 것과 같이 최대한 각 성능에서만 소모되는 시간을 측정하기위해 노력했다.
그 과정 속에서 썼던 파일 입출력에 대해 작성해보겠다.
" 파일 입출력 "
C Lang 측 linux에서 사용하는 파일 입출력은 stdio.h 헤더파일에 정의되어 있으며, fopen, fwrite, fread, fclose 등을 이용하여 파일을 생성, 읽고 쓰고 닫을 수 있다.
FILE *fopen (const char *filename, const char *mode) ;
-> 위 함수는 파일을 열기위한 함수이다. ' filename '은 열 파일의 경로와 이름, ' mode ' 는 열 파일 모드로, 파일을 읽기 전용으로 열지 쓰기 전용으로 열지를 지정할 수 있다. ' fopen ' 함수는 성공 시 파일 포인터를 반환하고, 실패 시 ' NULL '값을 반환한다.
' mode '의 값으로는 아래를 참고한다.
+ 참고
" r " : 파일을 읽기 모드로 열기
- 파일을 읽기 위해 열고, 파일의 시작부터 읽기가 가능하다.
" r+ " : 파일을 읽고 쓰기 모드로 열기
- 파일을 읽고 쓰기 위해 열고, 파일의 시작부터 읽기 가능하다. 이 모드에서는 파일의 내용이 변경된다.
" w " : 파일을 쓰기 모드로 열기. 파일이 존재하면 덮어쓴다.
- 파일을 쓰기 위해 열고, 파일의 내용이 삭제된다. 파일이 존재하지 않으면 새로운 파일을 생성한다.
" w+ " : 파일을 읽고 쓰기 모드로 열기. 파일이 존재하면 덮어씀
- 파일을 읽고 쓰기 위해 열고, 파일의 내용이 삭제된다. 파일이 존재하지 않으면 새로운 파일을 생성한다.
" a " : 파일을 쓰기 모드로 열기. 파일이 존재하면 파일 끝에 추가하는 식으로
- 파일을 쓰기 위해 열고, 파일의 끝에 추가된다. 파일이 존재하지 않으면 새로운 파일을 생성한다.
" a+ " : 파일을 읽고 쓰기 모드로 열기. 파일이 존재하면 파일 끝에 추가
- 파일을 읽고 쓰기 위해 열고, 파일의 끝에 추가된다. 파일이 존재하지 않으면 새로운 파일을 생성한다.
' fwrite ' 함수는 파일에 데이터를 쓰기 위한 함수로, 다음과 같이 사용된다.
size_t fwrite (const void *ptr, size_t size, size_t count, FILE *stream) ;
-> ' ptr '은 쓰기할 데이터가 저장된 버퍼의 시작 주소를 가리키는 포인터이다. ' size '는 각 데이터의 크기를 지정하는 인자이고, ' count '는 쓰려는 데이터의 개수를 지정하는 인자이다. ' stream '은 파일 포인터이다. ' fwrite '함수는 성공시 실제로 쓴 데이터의 개수를 반환하고, 실패 시 0을 반환한다.
int fprintf(FILE *stream, const char *format, ...) ;
-> ' fprintf() ' 함수는 c언어에서 파일 입출력 함수 중 하나로, 파일 포인터를 통해 파일에 문자열을 출력하는 함수이다. ' fprintf() '는 ' printf() ' 함수와 비슷한 구조를 가지고 있다.
첫 번째 인자로 파일 포인터를 받는다. 두 번째 인자로는 출력할 문자열의 형식을 나타내는 서식 문자열이 들어간다. 세 번째 인자부터는 서식 문자열에 들어갈 값들을 순서대로 넣어준다.
' fprintf() ' 함수는 파일에 출력하는 것 외에도, stdout이나 stderr에 출력할 수 있다.
보다 나은 파일 입출력 함수로는 ' fputs() '함수가 있다. ' fputs() ' 함수는 문자열을 파일에 출력하는 것 외에도, stdout이나 stderr에 출력할 수 있다. ' fprintf() ' 함수와는 달리 문자열만을 출력하므로, 포맷 문자열과 같은 복잡한 처리를 할 필요가 없다. 또한, ' frpintf() '함수와 비교해서 속도도 더 빠르다.
아래는 ' fputs() '함수의 기본적인 형태이다.
int fputs(const char *str, FILE *stream) ;
위 함수의 첫 번째 인자로는 출력할 문자열을 받고, 두 번째 인자로는 출력할 파일 포인터를 받는다. 반환값으로는 에러 발생 시 -1, 성공 시 0 이상의 값을 반환한다.
'Kernel & Linux programming with C Lang' 카테고리의 다른 글
Kernel linux 개발에 도움되는 라이브러리 정리 (0) | 2023.02.28 |
---|---|
linux에서 buffer에 timestamp를 찍기를 원할 때 알면 좋은 것들 (0) | 2023.02.22 |
kernel에서 함수 정의 시 static 키워드를 자주 사용하는 이유 (0) | 2023.02.22 |
kernel 개발에 필요한 키워드 정리 (c lang) (0) | 2023.02.22 |
상/하위 레이어 함수 간의 코드를 공유하는 방법 (0) | 2023.02.22 |