高级I/O模型(2)--dup/dup2

dup和dup2是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。

这两个函数的原形如下:

这里写图片描述

利用函数dup,我们可以复制一个描述符。
传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。

下面是用来说明dup函数使用方法的代码片段:

 int fd1, fd2;
    ...
  fd2 = dup( fd1 );

下面简单介绍一个的示例代码:

//在文件log里打印十次hello world
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>

int main()
{ 
    //close(1);
    int fd = open("./log", O_WRONLY|O_CREAT, 0644);
    if(fd < 0)
    { 
        perror("open\n");
        return 1;
    }
    close(1);
    fd = dup(fd);
    int count = 0;
    while(count++ < 10)
    { 
        printf("hello world!\n");
        fflush(stdout);
    }
    close(fd);
    return 0;
}

运行结果:
运行结果:
这里写图片描述

需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。
dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。

下面我们用一段代码加以说明:

    int  oldfd;
    oldfd = open("./log",(O_WRONLY | O_CREATE), 0644 );
    dup2( oldfd, 1 );
    close( oldfd );

本例中,我们打开了一个当前目录下的一个新文件,称为“log”,并收到一个文件描述符,该描述符叫做fd1。

我们调用dup2函数,参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。
任何写到stdout的东西,现在都将改为写入名为“log”的文件中。

下面简单介绍一个的示例代码:

//在文件log里打印十次hello world
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>

int main()
{ 
    umask(0);
    int fd = open("./log", O_WRONLY|O_CREAT, 0644);
    if(fd < 0)
    { 
        perror("open");
        return 1;
    }
    close(1);
    int ret = dup2(fd, 1);
    int count = 0;
    while(count++ < 10)
    { 
        printf("hello world!\n");
        fflush(stdout);
    }
    close(fd);
    return 0;
}

运行结果:
这里写图片描述

需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值