이전 포스트에서 설명한 대로 오픈된 파일은 각각 파일 디스크립터를 통해 파일에 접근 가능하다. 만약 하나의 파일이 두 개의 프로세스에 의해 오픈 되었다면 각각의 프로세스는 별도의 파일 디스크립터를 갖으며 별도의 파일 테이블을 참조하게 된다.
참조 : http://sinun.tistory.com/entry/System-Programming-UNIX-file-sharing-concept

dup 함수를 사용하게 되면 파일 디스크립터를 복제하게 된다. 그 의미는 하나의 프로세스에서 dup를 호출하였을 경우 새로운 파일 디스크립터가 생성되지만 커널의 파일 테이블과 v-node 테이블은 공유하게 된다. 그림으로 보면 다음과 같다.
간단한 프로그램으로 테스트를 진행해 보자. 프로그램의 내용은 다음과 같다.

#include <stdio.h>
#include <fcntl.h>

int main(int argc, char *argv)
{
        off_t offset;
        int fd, newfd;
        char buf1[]="0123456789";
        char buf2[]="abcdefghij";
        if((fd = open("dup.test", O_RDWR | O_CREAT | O_TRUNC)) < 0)
                error("open error\n");
        printf("Created FD is %d\n", fd);

        newfd = dup(fd);
        printf("Duped FD is %d\n", newfd);

        if(write(fd, buf1, 10) != 10)
                error("write error");
       
        /* offset now = 10 */
        if((offset=lseek(fd, 0, SEEK_CUR)) == -1)
                error("lseek fail");
        printf("Current offset is %d\n", offset);


        if(write(newfd, buf2, 10) != 10)
                error("write error");

        return 0;
}

개략적인 내용은 파일을 하나 오픈한 후 write를 하고 dup 함수를 이용하여 FD 값을 복제한 후 복제한 FD 값을 이용하여 오픈한 파일에 write 한다. 실행 결과 및 생성한 파일의 내용은 다음과 같다.
# ./dup_test
Created FD is 3
Duped FD is 4
Current offset is 10
# more dup.test
0123456789abcdefghij

                                                                                                    +---------------------------------+
                                                                                                    | Infinite Flow..                              |
                                                                                                    | mail : geekspark@gmail.com         |
                                                                                                    | Blog : http://sinun.tistory.com       |
                                                                                                    | twitter : @unpacker                      |
                                                                                                    | CISSP                                        |
                                                                                                    +----------------------------------+
Posted by By. PHR34K