第三章 文件I/O (四)

5,dup,dup2 复制一个现存的文件描述符

 

int dup2(int filedes, int filedes2)  from oldfd to newfd用已有描述符覆盖另一描述符

 

 

 

//-------------dup2.c----------------

 

#include <sys/types.h>

 

#include <sys/stat.h>

 

#include <fcntl.h>

 

#include <unistd.h>

 

#include "ourhdr.h"

 

#include "err_error.h"

 

 

 

main()

 

{

 

       int fd;

 

       if((fd=open("123",O_RDWR))==-1)

 

              err_sys("open error");

 

 

 

       if(dup2(fd,STDOUT_FILENO)==-1)

 

              err_sys("dup2 error");

 

       printf("/nWhere is those words?/n");

 

       //猜猜会不会在屏幕上输出

 

       close(fd);

 

}

 

//---------------end-------------------

 

 

 

king@king-laptop:~/blog$ gcc -o dup2 dup2.c

 

king@king-laptop:~/blog$ ./dup2

 

king@king-laptop:~/blog$ cat 123

 

 

 

Where is those words?

 

emptyking@king-laptop:~/blog$

 

这是怎么回事?

 

在进程中的文件描述符指向内核中的文件表,内核中的文件表指向文件(设备)。

 

在例子中,STDOUT_FILENO指向的是显示器设备,fd指向的是硬盘里的文件123

 

调用dup2fd覆盖了STDOUT_FILENO,使STDOUT_FILENO指向了硬盘里的文件123

 

系统默认的基本输出描述符就是STDOUT_FILENO,STDOUT_FILENOprintf引向了一个硬盘文件123上。

 

dup是生成一个文件描述符,原理相同,不再累述

 

 

 

在给一个例子,大家体会体会吧^_^

 

 

 

//------------------------重定向功能的实现----------------------------

 

#include "ourhdr.h"

 

#include <fcntl.h>

 

#include <unistd.h>

 

 

 

int main(void)

 

{

 

       int  fd,stdfd,desfd;

 

       char buffer[15]="Hello world!";

 

       stdfd=dup(STDOUT_FILENO);//保存基本输出设备

 

 

 

//---------------------------------------------------------------------------

 

       fd=open("datafile",O_WRONLY | O_CREAT | O_TRUNC, 0666);

 

       desfd=dup2(fd,STDOUT_FILENO);//本进程的文件描述符ffdSTDOUT_FILENO都指向了fd的文件表项也就是他们指向了同一个设备(STDOUT_FILENO不再指向显示器)

 

       write(STDOUT_FILENO,buffer,12);

 

//---------------------------------------------------------------------------

 

       //还原基本输出设备

 

       dup2(stdfd,STDOUT_FILENO);

 

       printf("stdout device!/n");

 

 

 

}

 

//---------------------------end-----------------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值