dup2複製文件描述符

dup2是Linux下用來實現文件描述符複製的api,dup2(fd1, fd2)將會把fd1複製到指定的fd2下,如果fd2是一個已經打開的描述符,dup2會自動的先將其安靜的關閉。我們知道Linux的進程表中會維護打開的文件表項,複製的作用是使fd2指向了fd1所指向同一個文件。當我們關閉了指向同一個文件的fd的時候,關閉一個fd另外一個fd是不受影響的。下面的例子我們通過把/dev/null複製給標準輸出,讓程序的標準輸出消失掉。

例子

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main() {
    printf("befor dup stdout!\n");
    int devNullFd = open("/dev/null", O_RDWR);
    dup2(devNullFd, STDOUT_FILENO);
    printf("after dup stdout!\n");
    sleep(30);
    close(devNullFd);
    const char* testStr = "test";
    write(STDOUT_FILENO, testStr, strlen(testStr));
    perror("error:");
    sleep(10);

    close(devNullFd);
    write(devNullFd, testStr, strlen(testStr));
    perror("error:");
    return  0;
}

結果

befor dup stdout!
error:: Success
error:: Bad file descriptor

文件表結構


sudo ls -l /proc/37410/fd
total 0
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 0 -> /dev/pts/6
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 1 -> /dev/null
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:34 2 -> /dev/pts/6
lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 3 -> /dev/null
發佈了44 篇原創文章 · 獲贊 7 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章