dup和dup2文件描述符相关函数
2016-05-06 09:03
169 查看
dup和dup2函数
dup和
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函数的用法,请结合后面的连环画理解程序的执行过程。
例 29.2. 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; }
图 29.9. dup/dup2示例程序
重点解释两个地方:
第3幅图,要执行
dup2(fd, 1);,文件描述符1原本指向
tty,现在要指向新的文件
somefile,就把原来的关闭了,但是
tty这个文件原本有两个引用计数,还有文件描述符
save_fd也指向它,所以只是将引用计数减1,并不真的关闭文件。
第5幅图,要执行
dup2(save_fd, 1);,文件描述符1原本指向
somefile,现在要指向新的文件
tty,就把原来的关闭了,
somefile原本只有一个引用计数,所以这次减到0,是真的关闭了。
整理自:Linux一站式编程指南
相关文章推荐
- 在centos7搜狗拼音输入法安装
- Scrum 项目1.0
- 实现当UILable的内容超出其范围后自动滚动效果
- Spring之AOP
- 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
- UIImage和Base64转化
- 线程池的使用(一)
- node.js插件nodeclipse安装图文教程
- 【C/C++】计时函数比较
- C++静态成员函数小结
- 项目经理应该如何控制风险?
- JQ实现图片切换
- 程序员必读:Linux内存管理剖析
- BootStrap组件-面版
- Activity组件
- 一台机器上运行多个ActiveMq
- SYSU_1620
- 闭包--javascript深入理解js闭包
- DP待整理
- 数据库数据恢复——方法持续更新