Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340679
  • 博文数量: 208
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 286
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-20 11:39
文章分类

全部博文(208)

文章存档

2014年(208)

我的朋友

分类: LINUX

2014-05-20 13:48:49

原文地址:dup and dup2的剖析 作者:hml1006

dup and dup2的剖析

分类: 【02】Linux 129人阅读 评论(0) 举报
dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结 构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一 个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。
#include
int dup(int oldfd);
int dup2(int oldfd, int newfd);
如果调用成功,这两个函数都返回新分配或指定的文件描述符,如果出错则返回-1。dup返回的新文件描述符一定该进程未使用的最小文件描述符,这一点和 open类似。dup2可以用newfd参数指定新描述符的数值。如果newfd当前已经打开,则先将其关闭再做dup2操作,如果oldfd等于 newfd,则dup2直接返回newfd而不用先关闭newfd再复制。

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

  1. "font-size:14px;">#include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7.    
  8. int main(void)  
  9. {  
  10. int fd, save_fd;  
  11. char msg[] = "This is a test\n";  
  12.   
  13. fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);  
  14. if(fd<0) {  
  15. perror("open");  
  16. exit(1);  
  17. }  
  18. save_fd = dup(STDOUT_FILENO);  
  19. dup2(fd, STDOUT_FILENO);  
  20. close(fd);  
  21. write(STDOUT_FILENO, msg, strlen(msg));  
  22. dup2(save_fd, STDOUT_FILENO);  
  23. write(STDOUT_FILENO, msg, strlen(msg));  
  24. close(save_fd);  
  25. return 0;  
  26. }  


重点解释两个地方:
第3幅图,要执行dup2(fd, 1);,文件描述符1原本指向tty,现在要指向新的文件somefile,就把原来的关闭了,但是tty这个文件原本有两个引用计数,还有文件描述符save_fd也指向它,所以只是将引用计数减1,并不真的关闭文件。
第5幅图,要执行dup2(save_fd, 1);,文件描述符1原本指向somefile,现在要指向新的文件tty,就把原来的关闭了,somefile原本只有一个引用计数,所以这次减到0,是真的关闭了。
阅读(370) | 评论(0) | 转发(0) |
0

上一篇:递归与循环

下一篇:select,poll和epoll使用

给主人留下些什么吧!~~