리눅스 시스템에서는 열려진 file descriptor를 복제하는 함수를 제공한다.
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
반환 값: 새로운 파일 디스크립터, 실패 시 -1
dup, dup2함수는 argument로 열린 file descriptor를 전달하면 같은 물리적 파일을 가리키는 새로운 file descriptor를 반환한다.
dup는 argument로 전달받은 file descriptor를 반환한다.
dup2는 새 file descriptor를 두 번째 argument(newfd2)로 설정한다.
즉 이 함수를 통해 새로운 file descriptor를 생성하면 기존의 file descriptor와 같은 파일 테이블 엔트리를 참조하게 된다.
참고로 작업 중이던 파일의 offset은 파일 엔트리에 저장되는 정보이므로, 두 개의 file descriptor가 접근하는 파일 작업의 offset은 같다.
/* 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] http://ehpub.co.kr/tag/dup2-%ED%95%A8%EC%88%98/
dup 함수는 처음 보네요 ヽ(°〇°)ノ
dup와 달리 dup2에 있는 두 번째 arg인 newfd는 oldfd와 차이가 무엇인가요??