dup函数

头文件和函数原型:

#include <unistd.h>
int dup(int oldfd);

dup函数是用来打开一个新的文件描述符,指向和oldfd同一个文件,共享文件偏移量和文件状态。

共享偏移量代码:

int main(int argc, char const *argv[])
{
int fd = open("testDup.txt", O_RDONLY);
int copyFd = dup(fd);
//将fd阅读文件置于文件末尾,计算偏移量。
cout << "fd = " << fd << " 偏移量: " << lseek(fd, 0, SEEK_END) << endl;
//现在我们计算copyFd的偏移量
cout << "copyFd = " << copyFd << "偏移量:" << lseek(copyFd, 0, SEEK_CUR) << endl;
return 0;
}

执行结果:

fd = 3 偏移量: 75
copyFd = 4偏移量:75

返回值

返回值就是一个新的文件描述符,失败为-1。

用下图可以描述此函数的作用:

当我们调用dup(3)的时候,会打开新的最小描述符,也就是4,这个4指向了3所指向的文件,后续操作这两个中任意一个fd都有一样的效果。

dup2函数

头文件和函数原型:

#include <unistd.h>
int dup2(int oldfd, int newfd);

dup2函数,把指定的newfd也指向oldfd指向的文件,也就是说,执行完dup2之后,有newfd和oldfd同时指向同一个文件,共享文件偏移量和文件状态。

如下图,一开始我们有文件描述符3指向文件A,4指向文件B。

现在我们执行:

dup2(3, 4);

也就是我们把4也指向了3所指向的文件。如下图:

再提供一下证明共享偏移量的代码:

int main(int argc, char const *argv[])
{
int fdOld = open("testDup.txt", O_RDONLY);
int fdNew;
fdNew = dup2(fdOld, 14);
//将fd阅读文件置于文件末尾,计算偏移量。
cout << "fdOld = " << fdOld << " 偏移量: " << lseek(fdOld, 0, SEEK_END) << endl;
//现在我们计算copyFd的偏移量
cout << "fdNew = " << fdNew << "偏移量:" << lseek(fdNew, 0, SEEK_CUR) << endl;
return 0;
}

执行结果:

fdOld = 3 偏移量: 75
fdNew = 14偏移量:75

返回值

成功返回newfd,失败返回-1.

Note

在我们执行dup2之前,最好手动执行:

close(newfd);

否则,当系统执行关闭newfd再指向oldfd时,有错误发生,那么就不能成功关闭原来所指向文件B了。

dup和dup2函数简单使用的更多相关文章

  1. dup和dup2函数

    下面两个函数都可用来复制一个现存的文件描述符: #include<unistd.h> int dup(int filedes); int dup2(int filedes,int file ...

  2. dup和dup2函数以及管道的实现

    疑问:管道应该不是这样实现的,因为这要求修改程序的代码 dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr. ...

  3. 文件I/O(不带缓冲)之dup和dup2函数

    下面两个函数都可用来复制一个现有的文件描述符: #include <unistd.h> int dup( int filedes ); int dup2( int filedes, int ...

  4. Unix 网络编程 dup和dup2函数

    dup和dup2也是两个很实用的调用,它们的作用都是用来复制一个文件的描写叙述符. 它们经经常使用来重定向进程的stdin.stdout和stderr.这两个函数的原形例如以下: #include & ...

  5. linux之dup和dup2函数解析

    1. 文件描述符在内核中数据结构在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个 ...

  6. dup与dup2函数

    依赖的头文件 #include <unistd.h> 函数定义 int dup(int oldfd); int dup2(int oldfd, int newfd); 函数作用 dup和d ...

  7. dup和dup2用法小结

    今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下. 首先来man一下: dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就 ...

  8. dup和dup2详解

    C语言中dup和dup2函数的不同和使用 发表时间: 2012年11月15日 | 作者: 陈杰斌 | 所属分类: C语言 | 评论: 0 | 浏览: 1024 在unix高级编程中有介绍dup和dup ...

  9. dup and dup2的剖析

    转:http://www.cnblogs.com/sdphome/archive/2011/04/30/2033381.html dup和dup2都可用来复制一个现存的文件描写叙述符,使两个文件描写叙 ...

随机推荐

  1. CA机构及SSL证书

    互联网安全形势日趋严峻,企业重视自身互联网安全已成必然,SSL认证成大势所趋.要部署SSL证书最首先就是选好CA机构!其次选择适合自己的SSL证书!今天就来介绍一下如何选择CA机构及SSL证书! 首先 ...

  2. 怎样使用 v-html 指令?

    v-html 可以在目标节点位置内部插入 html 子节点, 跟节点的 .innerHTML 属性类似, 使用方法如下: <!DOCTYPE html> <html lang=&qu ...

  3. Sharepoint 开启App 配置App

    如果没有Enable app,打开app store的时候出出现错误: Sorry, apps are turned off. If you know who runs the server, tel ...

  4. Bootstrap3基础教程 01 概述

    移动设备优先是 Bootstrap 3 的最显著的变化. 基础的页面: <!DOCTYPE html> <html> <head> <meta charset ...

  5. SpringMVC——正常访问静态文件,不要找不到静态文件报404的方法

    方案一:激活Tomcat的defaultServlet来处理静态文件 <span style="font-size:12px;"> <servlet-mappin ...

  6. JSP中的普通路径写法

    <% String path = request.getContextPath();     String basePath = request.getScheme()+"://&qu ...

  7. 创建LEANGOO看板

    转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_create_kanban.html#toggle-id-3 Leangoo使用看板来管理 ...

  8. JVM学习(二):垃圾回收

    我刚工作的时候问一个前辈,我们能针对JVM做出什么样的优化.前辈说,我们系统现在的性能并不需要调优,用默认的配置就能满足现在的需求了.我又问,那你为什么要看JVM相关的书呢?前辈微微一笑,悠悠地来了句 ...

  9. Python学习计划-首篇

    概述 Python语言这几年的热度一直持续上升,有多火也不用我再介绍了,光从近几年编程语言排行榜的上升热度就能看出,因此我也计划学习一下python语言,并且将每次的学习收获记录下来.一方面是记录下来 ...

  10. 织梦dedecms自定义功能函数(1):调用body中的图片(可多张)

    前言 岛主会整理或者开发一系列常用功能函数.所有自定义功能函数都是放在\include\extend.func.php文件里. 这次织梦自定义功能函数功能为:独立提取 body字段中(可以是自定义字段 ...