#inlcude <unistd.h>
int dup(int fd);
dup는 fd로 전달받은 파일 서술자를 복제하여 반환합니다. dup가 돌려주는 파일 서술자는 가장 낮은 서술자를 반환합니다. 성공시 새 파일 서술자, 오류시 -1을 반환합니다.
#include <unistd.h>
int dup2(int fd, int fd2);
dup2는 새 서술자의 값을 fd2로 지정합니다. 만일 fd2가 이미 열려있으면 fd2를 닫은 후 복제가 됩니다. 성공시 새 파일 서술자, 오류시 -1을 반환합니다.
#include <unistd.h> // 시스템 콜 (open(), write(), close() 등) 포함
#include <stdio.h> // 표준 입출력 함수 (printf()) 포함
#include <stdlib.h> // exit() 포함
#include <sys/stat.h> // 파일 권한 관련 상수 포함
#include <string.h>
#include <fcntl.h> 파일 조작을 위한 open(), dup() 등을 사용하기 위해 포함
int main(void) {
int fd1, fd2;
char message[32] = {"message via fd2\\n"};
fd1 = open("made_by_fd1", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
// fd1이라는 파일을 읽기(O_RDWR) 쓰기 모드와 생성(O_CREAT) 옵션으로 연다
if(fd1 < 0) {
printf("file open error\\n"); // 파일을 열지 못하면 file open error 출력
exit(0);
}
fd2 = dup(fd1); // 파일 디스크립터 복제
write(fd2, message, strlen(message)); // fd2를 통해 made_by_fd1에 "message via fd2\\n"을 씀.
printf("fd1 :%d, fd2:%d\\n", fd1, fd2);// fd1과 fd2가 같은 파일을 가리키므로, fd1을 사용해도 동일한 결과가 나옴.
close(fd1);
close(fd2);
}
fd 0 : 표준 입력 (stdin)
fd 1 : 표준 출력 (stdout)
fd 2 : 표준 에러 (stderr)
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
int main(void) {
int fd1, ret;
char message[32] = {"STDERR from fd1\\n"};
// 그림 1번
fd1 = open("made_by_fd1", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd1 < 0) {
printf("file open error\\n");
exit(0);
}
// 표준 입출력으로 print됨
printf("file open\\n");
// fd1의 파일 디스크립터가 명시한 STDOUT_FILENO의 파일 디스크립터로 복제됨
// 그림 2번
ret = dup2(fd1, STDOUT_FILENO); // 두번쨰 인자에서 첫 번째 인자를 가리키는걸로 바뀜
// fd1으로 출력됨
printf("fd1 : %d, ret:%d\\n", fd1, ret);
// STDERR_FILENO 디스크립터가 명시된 fd1으로 복제됨
// 그림 3번
ret = dup2(STDERR_FILENO, fd1);
// fd1은 에러로 출력됨
write(fd1, message, strlen(message));
// stdout이 file로 써짐
printf("printf를 썼지만 파일에 기록됨 \\n");
close(fd1);
}