《UNIXLinux程序设计教程》一3.4 dup()和dup2()函数

3.4 dup()和dup2()函数

用同一个open()打开的文件可以有多个描述字与它相连,这种描述字称为重复描述字。重复一个描述字有两种方法:用函数dup()或dup2(),或用函数fcntl()(3.6.1节)。

#include <unistd.h>

int dup (int old);
int dup2 (int old,int new);

dup()复制描述字old至一个新描述字,新描述字保证是当前未打开的最小编号可用描述字。dup2()复制描述字old至编号为new的描述字。如果new已经打开,它将首先被关闭。如果new等于old,dup2()返回new但不关闭它。
这两个函数调用成功返回新的文件描述字。所返回的新描述字与参数old给定的描述字引用同一个打开的文件,即共享同一个系统打开文件表项,如图3-3所示。

《UNIXLinux程序设计教程》一3.4 dup()和dup2()函数

在这个图示中,假定进程一开始便执行

newfd = dup(1);

因此newfd的值一定是3(因为描述字0、1、2已经由shell打开),它与描述字1都指向标准输出文件,因为它的进程打开文件表项由描述字1的表项复制而来。
正因为重复描述字共享同一个系统打开文件表项,因此,它们共享文件位置和一组文件状态标签(3.6.3节)。但是它们都有自己的文件描述字标签。这两个dup函数总是清除新描述字中的执行即关闭标签FD_CLOEXEC(参见3.6.2节)。
重复一个文件描述字的主要用途是实现输入输出重定向,即改变一个特定文件描述字对应的文件或管道。当使用管道进行进程间的通信时,这两个函数十分有用。第11章讨论进程间通信时将见到应用这两个函数的例子。
例3-3 程序3-3是用dup2()简单重定向的例子。它将标准输出文件重定向至名为myoutput的文件。运行这个程序可以看到printf()的输出不在终端而在文件myoutput中。

《UNIXLinux程序设计教程》一3.4 dup()和dup2()函数

上一篇:前端学习笔记(3) - JavaScript对象分类


下一篇:CCNA培训课总结笔记--RIPv2的汇总实验(七)