파일 디스크립터 File descriptor

민픽minpic·2023년 5월 24일
0

[TIL] Today I Learned

목록 보기
17/25

파일 디스크립터

리눅스 또는 유닉스 계열 시스템에서 프로세스가 파일을 다룰때 사용하는 개념이다. 흔히 유닉스 시스템에서의 모든 것을 파일이라고 한다. 일반적인 정규파일부터 우리가 곧 배울 소켓, 그리고 파이프, 블록, 디바이스 등 모든 객체들을 파일로 관리한다.

그래서 프로세스가 파일들을 접근할 때, 디스크립터라는 개념을 이용한다.

어떠한 파일이 생성되면, file descriptor 테이블에 index number 가 할당되고, 해당 index 번호에는 해당 파일에 대한 정보들이 들어있다.

Default 로 0,1,2 file descriptor은 다음과 같이 지정되어있다.

다음과 같이 file descriptor 구조를 볼 수 있다.

프로세스 별로 fd table 이 생성되고,
fd table 에는 fd flags, file ptr 두 가지 정보가 들어있다.
fd flag는 open() 할 때, 지정되는 flag로 초기화 된다. 추후에 변경하고 싶다면 fcntl() 함수를 사용하여 변경가능하다.

file ptr 은 연결된 파일에 대한 정보를 담고 있는 (table of open file descriptions) 테이블에서 해당 파일에 대한 위치 정보를 가지고 있다.

다음은 duplication FD 에 관련한 함수이다.

#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

dup()과 dup2의 큰 차이점은 dup()은 복사될 fd 값을 지정하지 않고, dup2는 지정한다는 점이다.

dup()은 인자값으로 들어온 fd를 비어있는 fd값중에 가장 작은 수의 인덱스 값에 복사하고, 복사된 곳의 fd 를 return 해준다.

dup2()는 원하는 fd 값을 지정해줘서 해당 fd값에 복사하고 새로운 fd 값을 반환해준다.

오류시 -1을 반환한다.

profile
사진찍는 개발자 / 한 가지 개념이라도 깊이있게

0개의 댓글