UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
来源:互联网 发布:有关修车的软件 编辑:程序博客网 时间:2024/06/05 02:35
UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符。
#include <unistd.h>
int dup(int filedes);
int dup2(int filedes, int filedes2);
返回值:若成功则返回新的文件描述符,如出错则返回-1.
由 dup 函数返回的文件描述符一定是当前可用文件描述符中的最小描述符。用 dup2 函数则可以通过参数 filedes2 指定目标文件描述符。如果filedes2 已经打开,则先将其关闭。如果 filedes 等于 filedes2,则 dup2 函数返回 filedes2,而不关闭它。
下面程序使用 open 打开文件 foo.txt,先使用 lseek 获取该文件描述符的当前偏移量。然后,调用 dup 该文件描述符,并调用 lseek 将新文件描述符的当前偏移量设置为距离文件开始处的 10 字节处。最后,用 lseek 获取并打印这两个文件描述符的当前偏移量。
#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <fcntl.h>#define FILE_MODE S_IRUSR | S_IWUSR | S_IRGRPintmain(void){ int fd, fddup; off_t fdoff, fddupoff; if ((fd = open("foo.txt", O_WRONLY | O_CREAT | O_TRUNC, FILE_MODE)) < 0) { printf("open error"); exit(-1); } if ((fdoff = lseek(fd, 0L, SEEK_CUR)) == -1) { printf("lseek error"); exit(-1); } printf("fd offset(before dup): %d\n", fdoff); if ((fddup = dup(fd)) == -1) { printf("dup error"); exit(-1); } if ((fddupoff = lseek(fddup, 10L, SEEK_SET)) == -1) { printf("lseek error"); exit(-1); } printf("fddup offset(after dup): %d\n", fddupoff); if ((fdoff = lseek(fd, 0L, SEEK_CUR)) == -1) { printf("lseek error"); exit(-1); } printf("fd offset(after dup): %d\n", fdoff); exit(0);}
编译该程序生成 dupdemo,然后运行该 dupdemo 文件,
lienhua34:demo$ gcc -o dupdemo dup_demo.clienhua34:demo$ ./dupdemofd offset(before dup): 0fddup offset(after dup): 10fd offset(after dup): 10
从 dupdemo 运行结果可以看到,对 dup 得到的文件描述符设置了文件当前偏移量,同时影响到了原来的文件描述符的当前偏移量。这是因为,dup 函数得到的新文件描述符跟原文件描述符共享了同一个文件表项,其内核数据结构如图 1 所示。
图 1: dup 后的内核数据结构
另外,每个文件描述符都有它自己的一套文件描述符标志。dup 得到的新文件描述符的执行时关闭(close-on-exec)标志总是有 dup 函数清除。
阅读全文
0 0
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
- UNIX环境编程学习笔记—文件I/O之标准I/O流
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
- UNIX环境编程学习笔记(14)——文件I/O之临时文件
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
- UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
- UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
- UNIX环境编程之<二>文件共享I/O操作dup,fcntl函数
- UNIX环境编程—文件I/O
- UNIX环境高级编程(第三版)学习笔记(三、文件I/O之二)
- UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
- UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限
- UNIX环境高级编程学习笔记(三)文件共享和其他文件I/O函数
- WHUST 2017 Div.2 Day 15 [2017-08-06](图论八题)
- java中如何设置HTTP协议的头信息(header)
- 学习笔记之浅谈面向对象编程4(继承中的构造方法)
- 两点画线比较简单的方法
- 简单分析某个棋牌游戏的抢位置功能
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
- HDU1829 A Bug's Life dfs黑白染色二分图
- QML组件之Component
- Tomcat服务器顶层结构和启动过程
- Java内部类的使用小结
- LeetCode 216. Combination Sum III
- Mybatis中SQL性能优化注意事项
- fabirc1.0商业正式版本源码解析10——文档翻译之Architecture
- SD卡写入linux镜像后存储变小