00. 目录

文章目录

  • 00. 目录
  • 01. 文件描述符复制概述
  • 02. 常用函数
    • 2.1 dup函数
    • 2.2 dup2函数
  • 03. 案例实战
    • 3.1 dup示例
    • 3.2 dup2示例
  • 04. 附录

01. 文件描述符复制概述

dup()dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。

这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁。对比于 dup(), dup2() 也一样,通过原来的文件描述符复制出一个新的文件描述符,这样的话,原来的文件描述符和新的文件描述符都指向同一个文件,我们操作这两个文件描述符的任何一个,都能操作它所对应的文件。

02. 常用函数

2.1 dup函数

#include <unistd.h>int dup(int oldfd);
功能:通过 oldfd 复制出一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符,最终 oldfd 和新的文件描述符都指向同一个文件。
参数:oldfd : 需要复制的文件描述符 oldfd
返回值:成功:新文件描述符失败: -1

2.2 dup2函数

#include <unistd.h>int dup2(int oldfd, int newfd);
功能:通过 oldfd 复制出一个新的文件描述符 newfd,如果成功,newfd 和函数返回值是同一个返回值,最终 oldfd 和新的文件描述符 newfd 都指向同一个文件。
参数:oldfd : 需要复制的文件描述符newfd : 新的文件描述符,这个描述符可以人为指定一个合法数字(0 - 1023),如果指定的数子已经被占用(和某个文件有关联),此函数会自动关闭 close() 断开这个数字和某个文件的关联,再来使用这个合法数字。
返回值:成功:返回 newfd失败:返回 -1

03. 案例实战

3.1 dup示例

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define SIZE 64//SSIZE_MAX//ssize_t read(int fd, void *buf, size_t count);int main(void)
{int fd = -1;int newfd = -1;int ret = -1;char buf[SIZE];//打开文件fd = open("txt", O_RDWR | O_CREAT | O_TRUNC, 0644);if (-1 == fd){perror("open"); goto err0;}//close(0);//文件描述符复制newfd = dup(fd); //newfd = fd;if (-1 == newfd){perror("dup"); goto err1;}printf("fd = %d  newfd = %d\n", fd, newfd);write(fd, "123456789", 9); write(newfd, "ABCDEFG", 7);//关闭文件close(fd);close(newfd);return 0;
err1:close(newfd);
err0:return -1;
}

编译和测试结果

通过上面的运行结果得知,dup() 后复制的新文件描述符是系统自动分配的最小可用的文件描述符。

3.2 dup2示例

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#define SIZE 64//SSIZE_MAX//ssize_t read(int fd, void *buf, size_t count);int main(void)
{int fd = -1;int newfd = -1;int ret = -1;char buf[SIZE];//打开文件fd = open("txt", O_RDWR | O_CREAT | O_TRUNC, 0644);if (-1 == fd){perror("open"); goto err0;}//close(0);//如果newfd已经打开了 那么就先关闭//文件描述符复制newfd = dup2(fd, 0);if (-1 == newfd){perror("dup2"); goto err1;}printf("fd = %d  newfd = %d\n", fd, newfd);write(fd, "123456789", 9); write(newfd, "ABCDEFG", 7);//关闭文件close(fd);close(newfd);return 0;
err1:close(newfd);
err0:return -1;
}

编译和测试结果

04. 附录

4.1 测试代码下载:

4.2 参考博客:【Linux系统编程】 文件描述符的复制:dup()和dup2()

【Linux系统编程】文件描述符的复制dup()和dup2()相关推荐

  1. Linux网络编程--文件描述符

    文件描述符 在Unix和Unix-like操作系统中,文件描述符(file descriptor, FD)是一个文件或者像pipe或者network socket等之类的输入/输出源的唯一标识. 文件 ...

  2. 外网访问arm嵌入式linux_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  3. 4. linux调用文件计算阶乘前5项和_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  4. linux 文件操作 编程,Linux系统编程------------文件操作(基础)

    一.文件操作 1.1 Linux文件系统结构 1.1.1  Linux常见系统目录 /bin  :  存放普通系统可执行的命令(ls wc等) /sbin  :  存放系统管理程序(fsck等) /b ...

  5. Linux C:文件描述符、IO重定向、恢复标准输入输出

    目录 一.文件描述符 二.IO重定向 三.重定向回终端.伪终端 四.恢复标准输入输出 一.文件描述符 在Linux中,文件描述符是一个非负整数的数据类型.是FILE结构体中的一个成员属性. 每打开或者 ...

  6. Linux系统编程-文件的操作

    Linux系统编程-文件操作 前言: Linux 中所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,硬件设备(键盘.监视器.硬盘.打印机)是文件,就连套接字(socket).网络通 ...

  7. linux系统编程——文件编程

    linux系统编程--文件编程 文章目录 linux系统编程--文件编程 一.如何创建.修改一个文件 二.linux系统调用的API 三.文件描述符 四.linux系统调用 1.创建文件-creat ...

  8. Linux下利用文件描述符恢复的成功失败实验

    数据误删除是作为初级运维人员常常遇到的"低级错误",一些有经验的老手有时也在疲劳.不冷静的情况下"马失前蹄".一旦误删除数据文件,尽快采用影响最小.最迅速的手段 ...

  9. 文件描述符的复制(dup)

    1.dup和dup2函数的介绍 int dup(int oldfd); 返回一个文件描述符,参数是要复制的那个文件描述符. 2.使用dup进行文件描述符的复制 (1)dup系统调用对fd进行复制,会返 ...

最新文章

  1. SAP MM在ML81N事务代码界面报错- Customizing incorrectly maintained –之对策
  2. 工作随笔之nginx 应用场景
  3. MongoDB分布式操作——分片操作
  4. 【Java学习】JDBC可以再深一点理解
  5. 计算机组成原理补充实验,计算机组成原理实验补充实验指导-实.doc
  6. 充满含金量的一场云原生Meetup,入场券免费发送中……
  7. oracle null的解析
  8. mysql没有实体框架_NET实体框架数据库更新未在MySQL数据库中创...
  9. linux下怎么查看程序异常,linux程序莫名异常怎么查
  10. jekins 持续集成手记
  11. NNS域名系统之SGAS
  12. java面试题整理_2018年最新java面试题整理。。。持续更新中。。。
  13. MAC电脑Command键怎么调换为Control键
  14. 爬虫遇到网页审查元素(开发者工具)打不开怎么办?
  15. 射线法判断点在多边形内适用范围_重庆球墨铸铁X射线实时成像实时成像系统真诚合作_丹东华日电气...
  16. iphone捷径未能连接服务器,ios13无法安装第三方捷径怎么办 不允许不受信任的快捷指令解决方法...
  17. 计算机课word反思,教学反思Word文档
  18. c语言编写日历作业,c语言实现一个简单日历
  19. 1905 杨辉三角
  20. CreateThread和_beginthread区别及使用http://blog.csdn.net/wxq1987525/article/details/6620210

热门文章

  1. [转]编程语言中的 鸭子模型(duck typing)
  2. 【转】理解JavaScript中的事件处理
  3. Hadoop安装记录
  4. 湖南科技大学计算机控制技术,湖南科技大学控制理论与控制工程专业
  5. MutationObserver详解
  6. mysql in or索引失效_in 索引失效的问题
  7. C++中虚函数工作原理和(虚)继承类的内存占用大小计算
  8. 微策略2011校园招聘笔试题(找出数组中两个只出现一次的数字)
  9. Visual Studio 2010 C++ 工程文件解读
  10. 7. Reverse Integer