dup and dup2的剖析
2014-01-10 10:32
316 查看
dup and dup2的剖析
/article/6134116.htmldup和
dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个
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再复制。
下面这个例子演示了
dup和
dup2函数的用法,请结合后面的连环画理解程序的执行过程。
#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,是真的关闭了。
相关文章推荐
- eclipse_javaEE配置中的常见问题及解决办法
- postgres数据库几个重要的备忘命令
- 12306
- #pragma alloc_text
- ubuntu自动挂载硬盘
- 一步一步学JBPM(8)——JBPM自由流
- undo表空间
- PHP的Reflection反射机制
- 解决ilasm.exe无法编译 IL代码一例
- C++ MFC EDIT控件显示多行内容,并总是在底部显示最新内容,滚动显示。
- MySql delimiter的作用是什么
- Jquery跨域获取php数据
- Go语言最佳实践——通道和并发
- C# #if DEBUG
- My97DatePicker时间日期控件的使用
- ora-00054:resource busy and acquire with nowait specified解决方法
- How to create a immutable class in java
- Delphi、PChar和Char数组的比较
- hdu 1850 Being a Good Boy in Spring Festival(组合游戏-博弈)
- Chrome概念模型 - 2