ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ dup2()
    C,C++ & Linux 2020. 5. 16. 23:22
    728x90

    dup2(2) 함수 기능

    파일 디스크립터를 지정된 파일 디스크립터 번호로 복사합니다.

    함수 원형

    #include <unistd.h>
    
    int dup2(int fd, int destFd);

    매개변수

    fd

    복사할 파일 디스크립터

     

    destFd

    복사된 파일 디스크립터 번호

    반환값

    성공 시 destFd 리턴

    에러 시 -1 리턴하고 errno 설정

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h> // for open
    #include <sys/types.h>
    #include <sys/stat.h>
    
    #define BUFFER_SIZE 1024
    
    int main(int argc, char *argv[]) {
        char *fname = "ssu_test.txt";
        int fd;
    
        // ssu_test.txt 파일 생성
        fd = creat(fname, 0666);
        printf("First printf is on the screen.\n");
    
        // ssu_test.txt 파일 디스크립터를 1번(표준 출력)으로 복사
        dup2(fd, 1);
    
        // 여기서부터는 표준 출력이 ssu_test.txt 로 바뀌어버림
        printf("Second printf is in this file.\n");
    
    	exit(0);
    }
    

    결과

    예제2

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h> // for open
    #include <sys/types.h>
    #include <sys/stat.h>
    
    #define BUFFER_SIZE 1024
    
    int main(int argc, char *argv[]) {
        char buf[BUFFER_SIZE];
        char *fname = "ssu_test.txt";
        int fd;
        int length;
    
        // 3번 = ssu_test.txt
        fd = open(fname, O_RDONLY, 0644);
    
        // 4번 = 1번(표준 출력)의 복사본
        if (dup2(1, 4) != 4) {
            fprintf(stderr, "dup2 call failed\n");
            exit(1);
        }
    
        while (1) {
            // ssu_test.txt 를 읽어서
            length = read(fd, buf, BUFFER_SIZE);
    
            if (length <= 0)
                break;
            
            // 표준 출력에 쓰기
            write(4, buf, length);
        }
    
    	exit(0);
    }
    

    결과

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ stat(2), lstat(2), fstat(2)  (0) 2020.05.17
    C/C++ sync(2), fsync(2), fdatasync(2)  (0) 2020.05.16
    C/C++ dup()  (0) 2020.05.16
    C/C++ pread(), pwrite()  (0) 2020.05.14
    C/C++ write()  (0) 2020.05.14

    댓글

Designed by Tistory.