Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3572100
  • 博文数量: 205
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7385
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-23 18:56
个人简介

将晦涩难懂的技术讲的通俗易懂

文章分类

全部博文(205)

文章存档

2024年(8)

2023年(9)

2022年(4)

2021年(12)

2020年(8)

2019年(18)

2018年(19)

2017年(9)

2016年(26)

2015年(18)

2014年(54)

2013年(20)

分类: LINUX

2014-04-07 10:28:54

dup返回的新文件描述符是当前可用文件描述符中的最小值。它返回的新描述符与参数fd共享一个文件表项(file对象)。调用dup会使file的引用计数增1,即增加“打开文件”引用计数。图3-3apue中的原图。

我们用以下程序测试并说明:


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <string.h>
  5. #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
  6. int main(int argc, char *argv[])
  7. {
  8.     int fd1=0,fd2=0;
  9. char buf1[]="hello";
  10. char buf2[]="world";
  11. fd1=open("./txt",O_RDWR|O_CREAT,FILE_MODE);
  12.     printf("fd1:%d\n",fd1);
  13. fd2=dup(fd1);
  14.     printf("fd2:%d\n",fd2);
  15.     if((write(fd1,buf1,strlen(buf1)))!=strlen(buf1))
  16. printf("write fd1 error!!!\n");
  17. close(fd1);
  18.     if((write(fd2,buf2,strlen(buf2)))!=strlen(buf2))
  19. printf("write fd2 error!!!\n");
  20. return 0;
  21. }

运行结果如图:

我们发现第一次调用close,文件并没有真正关闭,因为dupfile的引用计数为2close(fd1),只是使引用计数变为1,而file对象并没有销毁。我们可以用图形表示调用dup后的情况。

总结:dup会增加“打开文件引用计数”(file对象的引用计数),造成两个描述符指向同一file对象。但不会创建新的file对象。

阅读(1959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~