dup2复制文件描述符

来源:互联网 发布:rom软件下载 编辑:程序博客网 时间:2024/05/18 18:01

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:: Successerror:: Bad file descriptor

文件表结构

sudo ls -l /proc/37410/fdtotal 0lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 0 -> /dev/pts/6lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 1 -> /dev/nulllrwx------ 1 oujiangping oujiangping 64 Aug 21 16:34 2 -> /dev/pts/6lrwx------ 1 oujiangping oujiangping 64 Aug 21 16:35 3 -> /dev/null
原创粉丝点击