dupdup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。

#include <unistd.h>int dup(int oldfd);
int dup2(int oldfd, int newfd);

如果调用成功,这两个函数都返回新分配或指定的文件描述符,如果出错则返回-1。dup返回的新文件描述符一定该进程未使用的最小文件描述符,这一点和open类似。dup2可以用newfd参数指定新描述符的数值。如果newfd当前已经打开,则先将其关闭再做dup2操作,如果oldfd等于newfd,则dup2直接返回newfd而不用先关闭newfd再复制。

下面这个例子演示了dupdup2函数的用法,请结合后面的连环画理解程序的执行过程。

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
int fd, save_fd;
char msg[] = "This is a test\n";

fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if(fd<0) {
perror("open");
exit(1);
}
save_fd = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
close(fd);
write(STDOUT_FILENO, msg, strlen(msg));
dup2(save_fd, STDOUT_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
close(save_fd);
return 0;
}

重点解释两个地方:

  • 第3幅图,要执行dup2(fd, 1);,文件描述符1原本指向tty,现在要指向新的文件somefile,就把原来的关闭了,但是tty这个文件原本有两个引用计数,还有文件描述符save_fd也指向它,所以只是将引用计数减1,并不真的关闭文件。

  • 第5幅图,要执行dup2(save_fd, 1);,文件描述符1原本指向somefile,现在要指向新的文件tty,就把原来的关闭了,somefile原本只有一个引用计数,所以这次减到0,是真的关闭了。

dup and dup2的剖析相关推荐

  1. Linux文件,文件描述符以及dup()和dup2()

    一.Linux中文件 可以分为4种:普通文件.目录文件.链接文件和设备文件. 1.普通文件 是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据. ls -lh 来查 ...

  2. 用指针的观点来深入理解dup和dup2的用法

    用指针的观点来深入理解dup和dup2的用法 作者:ejian 2007-09-17 网上有很多资料详细讲解了dup和dup2的用法,有讲得不错的,但总感觉理解起来还是有点困难,通过实践,我发现一种C ...

  3. linux之dup和dup2函数解析

    理论介绍: 1. 文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从she ...

  4. linux存储--dup和dup2函数解析(十八)

    1.文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...

  5. dup和dup2以及cat函数函数

    今日命令: more filenamen //分屏显示filename 内容 od -c filename //使用二进制形式查看文件内容 dup和dup2也是两个非常有用的调用,它们的作用都是用来复 ...

  6. 【Linux系统编程】文件描述符的复制dup()和dup2()

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

  7. 【Linux系统编程】 文件描述符的复制:dup()和dup2()

    dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件. 这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当 ...

  8. 【转】Linux系统编程---dup和dup2详解

    正常的文件描述符: 在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表.看下图: 打开文件的内核数据结构 dup和dup2两个函 ...

  9. 浅谈dup和dup2的用法

    https://blog.csdn.net/u012058778/article/details/78705536 一.dup和dup2函数  这两个函数都可以来复制一个现有的文件描述符,他们的声明如 ...

最新文章

  1. linux端口找进程,Linux查看端口、进程情况及kill进程的方法
  2. 使用HTML5开发离线应用 - cache manifest
  3. 复杂版---JS获得某天是一年当中的第几天
  4. zepto为什么不支持animate,报animate is not a function
  5. Activity中finish()和onDestroy()的区别
  6. python文件命名 数字_python 批量修改数字类的文件名
  7. 接口Request传参的常用注解
  8. redis mysql 视图_Redis 可以用来做数据库吗?
  9. Vba_下载网络文件(图片)
  10. 正确的做事和做正确的事
  11. VS中读取NMEA数据进行定位精度分析
  12. java nginx 502_Nginx 502 Bad Gateway错误的解决方案
  13. 计算机常用英语词汇 短语,四级英语常用词汇短语
  14. python 解析excel模板_python 解析Excel
  15. 漏刻有时云守护数据可视化画质感知状态迭代说明文档
  16. 计算机系统时钟中断,什么是时钟中断时钟中断的举例
  17. Github项目(克隆,上传)简单git命令流程使用记录
  18. 树莓派+STM32人脸识别门禁系统(中)----- 树莓派部分
  19. 软件测试工作怎样修改本机IP,如何在命令行下更改IP地址
  20. 右中秋夜大观园即景联句三十五韵

热门文章

  1. python使用缩进来体现代码之间的逻辑关系-python使用缩进来体现代码之间的逻辑关系吗?...
  2. python对英语和数学的帮助-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
  3. python详细安装教程linux-在Linux上安装Python3
  4. python电脑安装-如何安装python
  5. python语法教程-Python语法教程总结规范
  6. python能在excel运行吗-用ExcelPython在Excel中调用Python
  7. python官方推荐的三本书-【数据分析】入门数据分析,你一定要看的三本书
  8. python语法基础知识总结-python语法基础知识
  9. python与php8-python和php对比
  10. python stm32-python学习(一)