[42서울] open(), read()

tamagoyakii·2022년 4월 25일
1

42seoul

목록 보기
2/19
post-thumbnail

오늘은 C에서 파일을 열고 읽는 방법에 대해서 공부했다. 42서울의 get_next_line 서브젝트를 시작하기 전에 이 개념에 대해 확실히 알고 있는게 좋을 듯 하다.

🧩 open()

1. 헤더

#include <fcntl.h>

2. 프로토타입

int open(const char *pathname, int options,);

3. 매개 변수

  1. pathname : 파일명
  2. options : mode(접근권한)를 설정한다.

    <기본 읽기 옵션>

    • O_RDONLY : 읽기 전용으로 열기
    • O_WRONLY : 쓰기 전용으로 열기
    • O_RDWR : 읽기와 쓰기가 모두 가능

    이 외에도 다양한 옵션들이 있다.

4. 반환 값

  • file descriptor : 파일을 성공적으로 읽은 경우
  • -1 : 오류가 발생한 경우

5. 설명

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)값을 이용해서 파일을 구별할 수 있는 것이다.

🧩 read()

1. 헤더

#include <unistd.h>

2. 프로토타입

ssize_t read(int fs, void *buf, size_t N);

3. 매개 변수

  1. fs : open(2), creat(2), socket(2), accept(2) 등을 통하여 정상적으로 open한 file descriptor
  2. buf : 데이터를 저장하는 버퍼
  3. N : 읽어올 데이터의 바이트 수

4. 반환 값

  • 0보다 큰 수 : 읽은 바이트 수, 보통 N 과 같은 값이지만, 아래의 경우에는 N 보다 작은 수가 출력된다.
    • end of file에 도달한 경우
    • 수신할 데이터가 아직 도착하지 않은 경우
    • peer(상대)에서 socket을 close했을 경우
  • 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

0개의 댓글