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

简介: 本节书摘来自华章出版社《UNIXLinux程序设计教程》一 书中的第3章,第3.4节,作者:赵克佳 沈志宇,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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所示。

screenshot

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

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中。

screenshot

相关文章
|
6月前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
170 0
|
6月前
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
69 2
|
30天前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
3月前
|
Unix Linux 程序员
Unix:Linux的“逗趣祖师爷”与它的不凡传承
在科技长河中,Unix犹如一颗恒星,既是历史见证者也是未来的启发者。1969年,因程序员肯·汤普森想在他的PDP-7上玩“Space Travel”游戏,意外创造了Unix,以简洁优雅的代码改变了操作系统的世界。进入90年代,林纳斯·托瓦兹受Unix启发,开发了开源免费的Linux,像是Unix调皮的孙子,不仅继承其精髓还增添了开放共享的精神。Unix与Linux之间的传承,就像是智者与追蝶孩童的故事,充满了岁月的智慧与新生的活力,提醒我们科技传奇往往源于不起眼的小事。下次使用Linux时,不妨会心一笑吧!
54 0
|
3月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
48 0
|
6月前
|
Unix Shell Linux
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
77 4
|
Unix 大数据 Linux
【Linux is not Unix】Linux前言
【Linux is not Unix】Linux前言
|
6月前
|
Oracle Ubuntu Unix
Unix与Linux区别
Unix: Unix是一个操作系统家族的名称,最早由贝尔实验室(Bell Labs)的肖像电机公司(AT&T)开发。最早的Unix版本是在1969年创建的。 Linux: Linux是由芬兰计算机科学家Linus Torvalds在1991年创建的。它是作为一个免费、开放源代码的Unix克隆而开始的。
101 1
|
6月前
|
Unix Shell Linux
在Unix/Linux Shell中,管道(`|`)和重定向
在Unix/Linux Shell中,管道(`|`)和重定向
91 1
|
6月前
|
Ubuntu Unix Linux
Unix/Linux操作系统的最强入门科普(经典)
Unix/Linux操作系统的最强入门科普(经典)
395 0