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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章