C 언어에서 같은 파일을 가리키는 파일 번호가 하나 더 필요하면 dup()으로 복제한다.
작게 실행해 보기
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/uio.h>
int main(void) {
FILE *fp = tmpfile();
if (!fp)
return 1;
if (fputs("abcdef", fp) == EOF || fflush(fp) == EOF) {
fclose(fp);
return 1;
}
int fd = fileno(fp);
if (fd < 0) {
fclose(fp);
return 1;
}
int copy = dup(fd);
if (copy < 0) {
fclose(fp);
return 1;
}
printf("original=%d copy=%d\n", fd, copy);
close(copy);
if (fclose(fp) == EOF)
return 1;
return 0;
}서로 다른 두 번호가 같은 열린 파일을 가리킨다. 복제 번호를 닫아도 원래 FILE 스트림은 남아 있다.
반환값과 주의점
성공하면 사용 가능한 가장 작은 새 디스크립터, 실패하면 -1이다. 복제된 번호도 따로 닫아야 한다.
복제된 번호들은 파일 위치와 파일 상태 플래그를 공유한다. 한쪽에서 read()하면 다른 쪽이 읽을 위치도 움직일 수 있다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기