UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
2014-08-28 22:35
399 查看
lienhua34
2014-08-23
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 获取并打印这两个文件描述符的当前偏移量。
编译该程序生成 dupdemo,然后运行该 dupdemo 文件,
从 dupdemo 运行结果可以看到,对 dup 得到的文件描述符设置了文件当前偏移量,同时影响到了原来的文件描述符的当前偏移量。这是因为,dup 函数得到的新文件描述符跟原文件描述符共享了同一个文件表项,其内核数据结构如图 1 所示。
图 1: dup 后的内核数据结构
另外,每个文件描述符都有它自己的一套文件描述符标志。dup 得到的新文件描述符的执行时关闭(close-on-exec)标志总是有 dup 函数清除。
2014-08-23
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_IRGRP int main(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.c lienhua34:demo$ ./dupdemo fd offset(before dup): 0 fddup offset(after dup): 10 fd offset(after dup): 10
从 dupdemo 运行结果可以看到,对 dup 得到的文件描述符设置了文件当前偏移量,同时影响到了原来的文件描述符的当前偏移量。这是因为,dup 函数得到的新文件描述符跟原文件描述符共享了同一个文件表项,其内核数据结构如图 1 所示。
图 1: dup 后的内核数据结构
另外,每个文件描述符都有它自己的一套文件描述符标志。dup 得到的新文件描述符的执行时关闭(close-on-exec)标志总是有 dup 函数清除。
相关文章推荐
- UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
- Unix环境编程学习笔记------在进程间传送文件描述符
- UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
- UNIX环境高级编程学习笔记(七)系统数据文件和信息
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
- UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
- UNIX环境编程学习笔记—文件I/O之标准I/O流
- UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
- UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
- UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
- UNIX环境编程学习笔记(14)——文件I/O之临时文件
- UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制