Happy to visit my research note ^^

내가 쓰는 파일 입출력에 대한 간단한 정리 본문

Kernel & Linux programming with C Lang

내가 쓰는 파일 입출력에 대한 간단한 정리

Liam Lim 2023. 2. 28. 13:00
728x90

 저자는 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 이상의 값을 반환한다.

728x90
Comments