dup와 dup2 함수는 UNIX 및 유닉스 계열 시스템에서 파일 디스크립터를 복사하는 데 사용되는 시스템 호출이다. 이 함수들은 주로 리소스의 핸들(예: 파일, 파이프, 소켓 등)을 복사하거나, 입출력 리디렉션을 구현할 때 사용된다.
dup 함수dup 함수는 주어진 파일 디스크립터의 복사본을 생성한다.
새로운 파일 디스크립터는 가장 낮은 번호의 사용 가능한 파일 디스크립터를 사용한다.
#include <unistd.h>
int dup(int oldfd);
oldfd: 복사하고자 하는 원본 파일 디스크립터1을 반환.dup2 함수dup2 함수는 dup와 비슷하지만, 복사 대상으로 사용할 파일 디스크립터 번호를 지정할 수 있다. 만약 지정된 번호의 파일 디스크립터가 이미 열려 있다면, dup2는 그것을 먼저 닫고 복사 작업을 수행한다.
#include <unistd.h>
int dup2(int oldfd, int newfd);
oldfd: 복사하고자 하는 원본 파일 디스크립터newfd: oldfd의 복사본이 될 파일 디스크립터 번호이다. 만약 newfd가 이미 열려 있는 파일 디스크립터라면, dup2는 newfd를 닫고 oldfd를 newfd에 복사한다.newfd를 반환하고, 실패 시 1을 반환한다.
- 위 그림은 fd2 = dup(fd1) 상황이다.
int dup(int oldfd)
dup 함수는 주어진 파일 디스크립터의 복사본을 생성한다. 이 말을 oldfd가 가리키는 파일에 접근할 수 있는 새로운 fd를 얻는다로 이해하자.
복사본이라는 말이 파일디스크립터의 구조를 모르면 오히려 이해하는데 방해가 되는거 같다. 위의 그림처럼 dup은 fd2와 fd1이 같은 파일테이블을 가리키게 만들어 준다고 생각하자.

- 2번 그림: dup2(fd1, STDOUT_FILENO(1))
- 3번 그림: dup2(STDERR_FILENO(2), fd1)
int dup2(int oldfd, int newfd);
dup2 함수는 dup와 비슷하지만, 복사 대상으로 사용할 파일 디스크립터 번호를 지정할 수 있다. 만약 지정된 번호의 파일 디스크립터가 이미 열려 있다면, dup2는 그것을 먼저 닫고 복사 작업을 수행한다.
dup2또한 newfd가 oldfd가 가리키는 파일테이블에 접근할 수 있도록 설정한다고 생각하면 쉽다.
기본적으로 할당되는 파일 디스크립터
0 : 표준 입력(Standard Input) / STDIN_FILENO
1 : 표준 출력(Standard Output) / STDOUT_FILENO
2 : 표준 에러(Standard Error) / STDERR_FILENO