Love Every Moment
〔Linux/Unix〕파일 디스크립터(File Descriptor)란? 본문
1. 파일 디스크립터
리눅스 운영 체계에서 파일에 대한 정보를 기술하고 유지하는 기억 장치의 영역
- 리눅스는 물리적 장치들을 일종의 파일로 관리
- 특히 리눅스 쉘은 작업에 필요한 파일들을 일종의 번호를 붙여서 관리
파일 디스크립터 | FD 대신 사용하는 이름 | 목적 |
0 | stdin | 표준 입력 |
1 | stdout | 표준 출력 |
2 | stderr | 표준 에러 |
2. 최대 파일 디스크립터
터미널에 ulimit -a 명령어를 치면 한번에 열 수 있는 최대한의 파일 개수를 알 수 있다.
현재 사용 중인 맥os 에서는 파일 디스크립터 256 까지 열 수 있다.
3. 파일 디스크립터가 부여되는 방식
파일 디스크립터는 표준 입력, 표준 출력, 표준 에러인 0 부터 2까지를 제외하면
open() 함수로 파일을 열어서 3 부터 번호를 부여하게 된다.
(1) HEADER FILE
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
(2) SYNTAX
int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
(3) PARAMETER
#1. PATHNAME: The name of the file. Can be Relative Path or Absolute Path.
#2. FLAGS: Opening options to the file
#3. MODE: The access rights to the file
(4) RETURN VALUE
Unsigned int value of the file descriptor. -1 if it fails.
(5) DESCRIPTION
- 기본 MODE
(1) O_RDONLY: 읽기 전용
(2) O_WRONLY: 쓰기 전용
(3) O_RDWR: 읽기와 쓰기 모두 가능
- 기타 MODE
(1) O_CREAT: 파일이 존재하지 않을 경우 파일을 생성
- 파일의 접근 권한을 지정해주어야 한다
open("example", O_WRONLY | O_CREAT, 0644);
(2) O_EXCL: O_CREAT 을 이용하여 파일을 오픈했는데 이미 파일이 존재하는 경우 에러를 반환
open( "example", O_WRONLY | O_CREAT | O_EXCL, 0644);
- "example" 이라는 파일이 없었을 경우에는 정상적으로 쓰기 전용 파일이 생성된다.
- 해당 파일이 이미 존재하는 경우에는 open() 에 실패하고 에러를 반환한다.
(3) O_TRUNC: 기존의 파일 내용을 모두 삭제
(4) O_APPEND: 기존 파일 내용에 추가하여 쓸 수 있도록 open() 후에 쓰기 포인터가 파일의 끝에 위치
4. 파일 디스크립터 이용하여 읽기
read() 함수를 이용하여 해당 파일을 읽을 수 있다.
(1) HEADER FILE
#include <unistd.h>
(2) SYNTAX
ssize_t read (int fd, void *buf, size_t nbytes)
(3) PARAMETERS
#1. fd: File Descriptor
#2. buf: The buffer to save the data
#3. nbytes: Buffer size
(4) RETURN VALUE
The number of bytes that are already read. -1 if it fails.
(5) DESCRIPTION
Reads the file which was opened by function open().
- 인자로 받은 nbytes 의 수만큼 fd 를 읽어 buf 에 저장하는 함수다.
- 읽어온 바이트 수를 반환하며, 실패시 -1을 반환한다.
- 파일을 끝까지 읽었다면, 다음 번에는 더 이상 읽을 바이트가 없기 때문에 0을 반환한다.
컴퓨터 코딩 프로그래밍 교육
'PROGRAMMING::CORE > Operating System' 카테고리의 다른 글
〔LINUX/UNIX〕리눅스 명령 탐색 경로: PATH (0) | 2021.06.28 |
---|---|
〔LINUX/UNIX〕프로세스 생성과 실행: pid, fork, exec, pipe (0) | 2021.06.25 |
〔LINUX/UNIX〕리디렉션(Redirection)과 파이프(Pipe) (0) | 2021.06.25 |
〔Linux/Unix〕Makefile 이란? 메이크 파일 작성하는 방법 (0) | 2021.06.01 |
〔LINUX/UNIX〕맥 OS 가장 자주 쓰는 단축키 정리 (0) | 2021.04.19 |