
file descriptor (파일 디스크립터) 란?
- 시스템으로부터 할당 받은 int (정수) 값. (= fd)
- fd 는 일반적으로 음수가 아닌 0과 양수 값을 가지지만, 파일 open에 실패하면 음수를 반환한다.
- 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스를 의미한다.
일반적으로 유닉스에서는 모든 객체를 파일로 관리하는데, 프로세스는 '파일 디스크립터' 개념으로 파일들에 접근한다.
응용 프로세스가 파일을 열거나, 생성하면, '파일 디스크립터'를 얻게 되고, 포인터처럼 파일을 가리키는데 사용한다.
여러 함수들 (read(), write(), fcntl(), close() ..) 등에서 이를 사용한다.
기본 파일 디스크립터
0 : 표준 입력 (standard input)
1 : 표준 출력 (standard output)
2 : 표준 에러 (standard error)
3 ~ : 생성하는 파일 디스크립터 차례대로 할당 (현재 가용한 숫자 중 최소)
음수 : file open에 실패
파일 디스크립터는 해당 파일의 주소를 참조하여 접근하는 방식이고, 이를 통해 파일을 다룬다.
open() 함수
#include <fcntl.h>
int open(const char *pathname, int flags[, mode_t mode]);
표준 C 라이브러리에서 파일 사용을 위해 fopen()을 제공한다면, 리눅스에서는 open()을 제공한다.
system call 함수인 open()은 이미 존재하는 파일을 열거나, 새 파일을 생성한다.
open의 return 값이 바로 파일 디스크립터이고, 0 이상이면 정상적으로 파일을 연 것이고, -1이면 open 오류이다.
fcntl.h 에 정의된 파일 열기 옵션들을 flags 부분에 작성하면 지정된 옵션으로 파일을 open 한다.
파일 열기 옵션
O_RDONLY : 읽기 전용으로 열기
O_WRONLY : 쓰기 전용으로 열기
O_RDWR : 읽기 쓰기 모두 가능하게 열기
O_CREAT : 해당 파일이 없으면 생성, 파일 접근 권한을 지정하기 위해 권한 값 (mode)를 추가해야 함.
mode 값은 0644 를 일반적으로 사용한다. (의미 : rw- | r-- | r-- user에게 읽기쓰기, group과 world 에는 읽기 권한을 준다.)
(이외에도 O_EXCL, O_TRUNC, O_APPEND, O_NOCITTY, O_NONBLOCK, O_SYNC 등이 있다.)
새로운 일반 파일을 생성하거나 열면 파일 디스크립터가 3으로, open이 3을 반환한다.
그 이후로 새로운 파일들을 open하게 되면 4, 5, ... 로 늘어나게 된다.
'프로그래밍 > C' 카테고리의 다른 글
[library] isalnum 구현하기 (0) | 2024.03.13 |
---|---|
[study] 구조체 & 구조체 포인터 (0) | 2024.03.13 |
[study] 함수 포인터 (1) | 2024.03.11 |
[library] isdigit 구현하기 (0) | 2024.02.29 |
[library] isalpha 구현하기 (0) | 2024.02.29 |