DUP(2)

명칭
dup, dup2 - 기존의 파일 기술자를 복제한다

프로그램 라이브러리
libc

서식
<unistd.h> int dup(int oldd) int dup2(int oldd, int newd)

해설
dup() (은)는 기존의 오브젝트 기술자를 복제해, 그 값을 호출해 프로세스에 돌려줍니다 (newd = dup(oldd)). 인수 oldd (은)는 프로세스의 기술자 테이블내의 인덱스로, 부가 아닌 작은 정수입니다. 그 값은 테이블의 사이즈보다 작지 않으면 안됩니다. 테이블의 사이즈는 getdtablesize(2) 에 의해 돌려주어집니다. dup() 호출은, 그 때에 프로세스에 의해 사용되어 있지 않은 번호 가운데, 가장 작은 번호가 붙은 기술자를 돌려줍니다.

기술자가 참조하는 오브젝트는 oldd (와)과 newd (을)를 전혀 구별하지 않습니다. 따라서 newd (와)과 oldd 하지만 오픈된 파일에의 복제된 참조였던 경우, 모든 read(2), write(2) 및 lseek(2) 호출은, 단일의 포인터를 파일내에서 이동합니다. 추가 모드, 논브록킹 입출력 및 비동기 입출력 옵션은 각 참조동안에서 공유됩니다. 하나의 파일에의 다른 포인터가 필요한 경우는, 추가의 open(2) (을)를 호출해, 파일에의 다른 오브젝트 참조를 얻을 필요가 있습니다. 이 때, 새로운 파일 기술자의 close-on-exec 플래그는 설정 해제되고 있습니다.

dup2() 에는 새로운 기술자 newd 의 값을 지정합니다. 이 기술자가 이미 사용되고 있었을 경우, oldd newd 이면, 우선 그 기술자는 close(2) 하지만 불려 갔는지와 같이 할당 해제됩니다. oldd 하지만 유효한 기술자가 아니었던 경우에는, newd (은)는 클로우즈 되지 않습니다. oldd == newd (이어)여, 게다가 oldd 하지만 유효한 기술자의 경우, dup2() (은)는 정상적으로 종료해, 아무것도 하지 않습니다.

반환값
몇개의 호출로 에러가 일어났을 경우는 값 -1 이 돌려주어집니다. 외부 변수 errno (은)는 에러의 원인을 나타냅니다.

에러
dup() (와)과 dup2() (은)는 다음의 경우에 처리에 실패합니다.

[EBADF]
    oldd 또는 newd 하지만 유효한 액티브 기술자가 아닙니다.

[EMFILE]
    액티브한 기술자가 너무 많습니다.

관련 항목
accept(2), close(2), fcntl(2), getdtablesize(2), open(2), pipe(2), socket(2), socketpair(2)

표준
dup() 함수와 dup2() 함수는, p1003.1-90 에 준거하고 있습니다.

역사
dup() 함수와 dup2() 함수는 AT&T UNIX 그리고 등장했습니다.