用同一个open()打开的文件可以有多个描述字与它相连,这种描述字称为重复描述字。重复一个描述字有两种方法:用函数dup()或dup2(),或用函数fcntl()。
#include <unistd.h>
int dup (int old);
int dup2 (int old,int new);

dup()复制描述字old至一个新描述字,新描述字保证是当前未打开的最小编号可用描述字。dup2()复制描述字old至编号为new的描述字。如果new已经打开,它将首先被关闭。如果new等于old,dup2()返回new但不关闭它。

这两个函数调用成功返回新的文件描述字。所返回的新描述字与参数old给定的描述字引用同一个打开的文件,即共享同一个系统打开文件表项

在这个图示中,假定进程一开始便执行
newfd = dup(1);

因此newfd的值一定是3(因为描述字0、1、2已经由shell打开),它与描述字1都指向标准输出文件,因为它的进程打开文件表项由描述字1的表项复制而来。

正因为重复描述字共享同一个系统打开文件表项,因此,它们共享文件位置和一组文件状态标签。但是它们都有自己的文件描述字标签。这两个dup函数总是清除新描述字中的执行即关闭标签FD_CLOEXEC。

重复一个文件描述字的主要用途是实现输入输出重定向,即改变一个特定文件描述字对应的文件或管道。当使用管道进行进程间的通信时,这两个函数十分有用。第11章讨论进程间通信时将见到应用这两个函数的例子。

 下面这个程序是用dup2()简单重定向的例子。它将标准输出文件重定向至名为myoutput的文件。运行这个程序可以看到printf()的输出不在终端而在文件myoutput中。

int main(void)
{int fd;if((fd = open("myoutput",O_WRONLY|O_CREAT,0644)) == -1)err_exit("myoutput");if(dup2(fd,STDOUT_FILENO) == -1)    /* 重复标准输出至fd相连的文件myoutput */err_exit("Redirect standard output failed");printf("this is a test program for redirect \n");close(fd);
}

下面给出 一个关于dup、dup2 文件描述符重定向函数的程序 

#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
int main(void)
{#define STDOUT 1   //标准输出文件描述符 号int nul, oldstdout;char msg[] = "This is a test";/* create a file */
//打开一个文件,操作者具有读写权限 如果文件不存在就创建nul = open("DUMMY.FIL", O_CREAT | O_RDWR,S_IREAD | S_IWRITE);/* create a duplicate handle for standardoutput */
//创建STDOUT的描述符备份oldstdout = dup(STDOUT);/*redirect standard output to DUMMY.FILby duplicating the file handle onto thefile handle for standard output.*/
//重定向STDOUT到nuldup2(nul, STDOUT);/* close the handle for DUMMY.FIL */
//重定向之后要关闭nulclose(nul);/* will be redirected into DUMMY.FIL */
//写入数据write(STDOUT, msg, strlen(msg));/* restore original standard outputhandle */
//还原dup2(oldstdout, STDOUT);/* close duplicate handle for STDOUT */close(oldstdout);return 0;
}
//结果就是msg写到了文件中而不是STDOUT

UNIX重定向--dup(2)函数相关推荐

  1. dup/dup2函数

    #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 当调用dup函数时,内核在进程中创建一个新的 ...

  2. 一.关于实现浏览器弹窗提示内容几秒后自动消失重定向执行其他函数的两种方法

    一.关于实现浏览器弹窗提示内容几秒后自动消失重定向执行其他函数的两种方法 第一种方法–向body动态写入div标签调用css效果显示: (新建***.jsp放在WebContent根目录下直接访问ip ...

  3. UNIX网络编程-listen函数及其包裹函数介绍

    UNIX网络编程-listen函数及其包裹函数介绍 函数简介 #include<sys/socket.h>int listen(int sockfd,int backlog);返回:若成功 ...

  4. linux文件重定向 dup,linux之dup和dup2函数解析

    linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户 ...

  5. 进程间通信管道进阶篇:linux下dup/dup2函数的用法

    由于利用管道实现进程间通信,是通过创建两个文件描述符,但是描述符的初始化是通过随机的,就是从可用的文件描述符中取出,并将可用的文件描述符与file对象相关联,如果我们需要将管道的两头与其他的流相关时, ...

  6. dup,dup2函数

    这两个函数的功能是输出的重定向       定义这两个函数的头文件是unistd.h,有兴趣的可以自己看看这个头文件包含的内容              要提的是这个头文件同时定义了下面三个常量 ST ...

  7. linux下dup函数,Linux dup dup2函数理解

    在linux中,我们需要复制文件描述符,下面是我对文件描述符的理解 int dup(int fd); // 复制一个已经存在的文件描述符,如果成功,返回复制成功后的文件描述符,失败返回-1 int d ...

  8. dup/dup2函数的用法

    系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新 ...

  9. linux dup作用,linux dup()\dup2()函数

    dup函数的作用:复制一个现有的句柄,产生一个与"源句柄特性"完全一样的新句柄(也即生成一个新的句柄号,并关联到同一个设备) dup2函数的作用:复制一个现有的句柄到另一个句柄上, ...

最新文章

  1. 区块链公司Coingeek支持一系列BCH协议变更
  2. 创建性设计模式之2--建造者模式
  3. haproxy 参数说明
  4. Spring集成Mybatis多数据源配置
  5. OpenCV多目标跟踪与视频分析
  6. 实战:kafka实现日志收集系统
  7. 俯视角场景搭配潮流色彩,诠释海报唯美视角
  8. 【演化计算】【论文研读】Completely Automated CNN Architecture Design Based on Blocks
  9. 对象流--对象的序列化
  10. python字符串find_Python字符串find()
  11. Andriod动画效果总结以及帧动画实现
  12. 【转载】mac读取ntfs硬盘方法
  13. edge扩展下载失败或edge报错0x80072ee7
  14. mysql 中的any_value 函数
  15. 数据结构翻转课堂答疑实录——概述
  16. Java进阶学习-7 面向对象程序设计原则
  17. NTFS下的USN日志文件
  18. RecycleView 二级列表(多级列表)
  19. ixigua解析_蓝叶分享西瓜视频地址解析php代码
  20. unity使ui面向镜头_pihqcam面向相机的软件ui

热门文章

  1. 通过网络方式安装linux的五种方法
  2. word标题文字居中浅谈
  3. 世界最成功的僵尸网络使用Fast Flux技术躲避检测
  4. 团队开发冲刺第二阶段_4
  5. 项目百态:软件项目管理面面观
  6. 通过图形界面配置Exchange2010 DAG
  7. 一起谈.NET技术,Silverlight 游戏开发小技巧:动感小菜单
  8. Unity Application Block-配置文件的使用-示例(附×××)
  9. agc018B Sports Festival
  10. Sublime Text插件的离线安装-使用htmlprettify美化您的HTML代码