DUP(2)

이름
dup, dup2 - 파일 디스크립터를 복사한다.

사용법
#include <unistd.h>

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

설명
dup 그리고 dup2는 파일 디스크립터 oldfd에 대한 복사본을 생성한다. dup 또는 dup2가 성공적으로 수행되면, oldfd 디스크립터와 복사된 새로운 디스크립터는 서로 공유되어 사용될 것이다. 이 디스크립터들은 락(lock), 파일 위치 포인터 그리고 플래그를 공유한다; 예를 들어, 만약 파일 위치가 한 디스크립터에서 lseek를 사용해 변경되면 이 변경된 위치는 다른 디스크립터에도 영향을 미친다. 그러나 이 두 디스크립터는 close-on-exec 플래그는 공유하지 않는다. dup는 복사되어질 새로운 디스크립터로, 사용되지 않는 가장 작은 디스크립터 번호를 이용한다. dup2는 필요하다면 먼저 newfd를 닫고, oldfd를 newfd 에 복사한다.

반환값
dup 그리고 dup2 는 복사된 새로운 디스크립터를 리턴하다. 또는 에러 (errno 값을 적절하게 설정한다) 가 발생한 경우에는 -1을 리턴한다.

에러

EBADF
    oldfd이 열린 파일 디스크립터가 아니거나, newfd가 파일 디스크립터의 허용된 범위를 넘어선 경우이다.

EMFILE
    프로세스가 이미 최대로 열 수있는 파일 디스크립터의 갯수를 가진 상태에서 새로운 파일 디스크립터를 열고자 시도한 경우이다.

경고
newfd가 허용 가능한 범위 밖의 값일 때, dup2에 의해 리턴된 에러값은 fcntl(..., F_DUPFD, ...)에 의해 리턴된 에러값과는 다르다. 어떤 시스템에서는 dup2가 F_DUPFD와 같은 EINVAL을 리턴하기도 한다.

호환
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. SVr4에서는 추가적으로 EINTR와 ENOLINK 에러 상태를 기술하고 있다. POSIX.1는 EINTR을 추가했다.

관련 항목
fcntl(2), open(2), close(2).

역자
정동현 <dhjung@serome.co.kr>, 2000년 4월 20일