dup() && dup2()
리눅스 시스템에서는 열려진 file descriptor를 복제하는 함수를 제공한다.
✔️ header
1
#include <unistd.h>
✔️ prototype
1
2
3
4
int dup(int oldfd);
int dup2(int oldfd, int newfd);
반환 값: 새로운 파일 디스크립터, 실패 시 -1
✔️ description
dup
, dup2
함수는 argument로 열린 file descriptor를 전달하면 같은 물리적 파일을 가리키는 새로운 file descriptor를 반환한다.
dup
는 argument로 전달받은 file descriptor를 반환한다. dup2
는 새 file descriptor를 두 번째 argument(newfd2)로 설정한다.
즉 이 함수를 통해 새로운 file descriptor를 생성하면 기존의 file descriptor와 같은 파일 테이블 엔트리를 참조하게 된다. 참고로 작업 중이던 파일의 offset은 파일 엔트리에 저장되는 정보이므로, 두 개의 file descriptor가 접근하는 파일 작업의 offset은 같다.
✔️ use case
1
2
3
4
5
6
7
8
9
10
11
12
/* dup example */
fd1 = open ("made_by_fd1",O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if (fd1 < 0) {
printf ("file open error\n");
exit(0);
}
fd2 = dup(fd1);
/* dup2 example */
ret = dup2(OLD_FD, NEW_FD);
references: 1