UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符
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 获取并打印这两个文件描述符的当前偏移量。
#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)) < ) {
printf("open error");
exit(-);
}
if ((fdoff = lseek(fd, 0L, SEEK_CUR)) == -) {
printf("lseek error");
exit(-);
}
printf("fd offset(before dup): %d\n", fdoff);
if ((fddup = dup(fd)) == -) {
printf("dup error");
exit(-);
}
if ((fddupoff = lseek(fddup, 10L, SEEK_SET)) == -) {
printf("lseek error");
exit(-);
}
printf("fddup offset(after dup): %d\n", fddupoff);
if ((fdoff = lseek(fd, 0L, SEEK_CUR)) == -) {
printf("lseek error");
exit(-);
}
printf("fd offset(after dup): %d\n", fdoff);
exit();
}
编译该程序生成 dupdemo,然后运行该 dupdemo 文件,
lienhua34:demo$ gcc -o dupdemo dup_demo.c
lienhua34:demo$ ./dupdemo
fd offset(before dup):
fddup offset(after dup):
fd offset(after dup):
从 dupdemo 运行结果可以看到,对 dup 得到的文件描述符设置了文件当前偏移量,同时影响到了原来的文件描述符的当前偏移量。这是因为,dup 函数得到的新文件描述符跟原文件描述符共享了同一个文件表项,其内核数据结构如图 1 所示。

图 1: dup 后的内核数据结构
另外,每个文件描述符都有它自己的一套文件描述符标志。dup 得到的新文件描述符的执行时关闭(close-on-exec)标志总是有 dup 函数清除。
UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符的更多相关文章
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mod ...
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...
- UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ...
- UNIX环境编程学习笔记(20)——进程管理之exec 函数族
lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序 ...
随机推荐
- java好用的邮件发送
1.action代码 // 发送邮件 String strEMAIL = Tools.readTxtFile(Const.EMAIL); //读取邮件配置 String strEM[] = strEM ...
- 【转】 oracle 层次查询判断叶子和根节点
Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...
- Windows系统32位、64位DLL文件的存放位置
查资料时无意中发现,Windows系统存放DLL的文件路径似乎有点蹊跷: 32位的DLL存放在C:\Windows\SysWOW64,而64位的DLL存放在C:\Windows\System32.即使 ...
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
引自:http://blog.csdn.net/sinat_26917383/article/details/72861152 中文文档:http://keras-cn.readthedocs.io/ ...
- Azkaban上传出错
Error initializing project id: 4 version: 2 打包文件上传时,自动生成的中文名导致的,这里的压缩包不能用中文名称.
- 虚拟机创建及安装ELK
虚拟机创建及安装ELK 作者:高波 归档:学习笔记 2018年5月31日 13:57:02 快捷键: Ctrl + 1 标题1 Ctrl + 2 标题2 Ctrl + 3 标题3 C ...
- Java扫描classpath指定包路径下所有class
在写框架时 经常需要扫描classpath指定包路径下带有某个Annotation的类,自己整理了一下 封装成一个工具类了,供大家参考. 源代码ClassPathResourceScanner.jav ...
- json如何把键名作为变量?
有时候在项目开发过程中,我们需要把json对象的键名作为一个变量.此时我们该怎么做呢? 传统的json数据格式如下: <script type="text/javascript&quo ...
- Java知多少(17)强调一下编程风格
讲完了Java的基础语法,大家就可以编写简单的程序代码了,这里有必要强调一下编程风格. 代码风格虽然不影响程序的运行,但对程序的可读性却非常重要.自己编写的程序要让别人看懂,首先在排版方面要非常注意. ...
- jQuery运行方式818
我们平时打开JQ源码就会看到这么一段代码 (function (window, undefined) { //JQ代码 })(window) 有一点经验的朋友会知道这是js自执行函数 它的好处主要作用 ...