월요일, 1월 09, 2017

[Linux/C] dup 명령어

dup는 사용중인 파일 디스크립터 (File Descriptor, 이하 fd)를 복사해주는 명령어이다.

unistd.h에 정의되어 있으며, 다음과 같이 두 가지 형태가 있다.
#include <unistd.h>
int dup (int filedes);
int dup2 (int filedes1, int filedes2);
filedes (또는 filedes1)에 복사하고자 하는 fd를 인자로 넣어준다.

dup() 함수는 open() 함수와 마찬가지로 할당 가능한 fd 값 중 가장 작은 번호를 return한다. 이미 예약되어 있는 0, 1, 2는 제외하고 3번부터 할당이 시작된다.

dup2() 함수는 filedes1가 참조하고 있는 파일에 대해 새로운 fd를 생성하는데, filedes2에 사용자가 인자로 제공한 값으로 생성을 한다. 즉, filedes1을 filedes2로 복사하는 것이다. 사용자가 원하는 숫자로 fd를 할당할 수 있다는 점에서 dup() 함수와 차이가 있다.

예제와 함께 살펴보자.
  1 #include <stdio.h>
  2 #include <fcntl.h>
  3 #include <unistd.h>
  4
  5 int main(void) {
  6   char *fname = "result.txt";
  7   int fd1, fd2;
  8
  9   if((fd1 = creat(fname, 0666)) < 0) {
 10     printf("creat error\n");
 11     return 1;
 12   }
 13
 14   printf("First one is on the screen.\n");
 15   fd2 = dup2(fd1, 1);
 16   printf("Second one is in this file.\n");
 17   printf("fd2:%d\n", fd2);
 18   return 0;
 19 }
15행을 보면 dup2() 함수를 사용해 result.txt 파일의 fd를 1로 복사한다. 1번 fd는 표준출력 (stdout)을 뜻하기 때문에 이후에 printf를 통해 문자열을 출력할 경우 콘솔창이 아니라 result.txt 파일로 출력이 될 것이다. 따라서 위 코드를 실행시켜보면, 콘솔창에 "First one is on the screen"이 출력될 것이고, 새로 생성된 result.txt라는 파일에 "Second one is in this file", 그리고 "1"이 출력되어 있을 것이다.

댓글 없음:

댓글 쓰기