오늘은 C에서 파일을 열고 읽는 방법에 대해서 공부했다. 42서울의 get_next_line 서브젝트를 시작하기 전에 이 개념에 대해 확실히 알고 있는게 좋을 듯 하다.
#include <fcntl.h>
int open(const char *pathname, int options, …);
<기본 읽기 옵션>
O_RDONLY
: 읽기 전용으로 열기O_WRONLY
: 쓰기 전용으로 열기O_RDWR
: 읽기와 쓰기가 모두 가능이 외에도 다양한 옵션들이 있다.
file descriptor
: 파일을 성공적으로 읽은 경우-1
: 오류가 발생한 경우ibm에서 제시하는 기본적인 설명은 이렇다.
“Opens a file and returns a number called a file descriptor.”
즉, 파일을 열어서 "파일 디스크립터"라는 놈을 반환해준다는 것이다. 여기서 우리는 파일 디스크립터가 무엇인지 짚고 넘어가야 한다. 마찬가지로 ibm에서 제시하는 설명은 이렇다.
"A file descriptor is an unsigned integer used by a process to identify an open file."
프로세스(process)가 파일을 구별하기 위해 사용되는 0이 아닌 양의 정수라고 생각하면 되겠다. 프로세스가 실행될 때 파일 디스크립터에는 아래의 세 값이 기본적으로 할당된다.
0
: 표준입력(Standard Input)
1
: 표준 출력(Standard Output)
2
: 표준에러(Standard Error)
프로세스가 실행 중 파일을 open()
하게 되면, 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 열려있는 파일에 접근할 때, 파일 디스크립터(fd)값을 이용해서 파일을 구별할 수 있는 것이다.
#include <unistd.h>
ssize_t read(int fs, void *buf, size_t N);
0보다 큰 수
: 읽은 바이트 수, 보통 N
과 같은 값이지만, 아래의 경우에는 N
보다 작은 수가 출력된다.0
: EOF에 도달하여 더 이상 읽을 메모리가 없는 경우-1
: 오류가 발생한 경우https://www.ibm.com/docs/en/zos/2.1.0?topic=functions-open-open-file
https://www.ibm.com/docs/en/zos/2.2.0?topic=functions-read-read-from-file-socket
https://www.it-note.kr/201