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. CSS——font使用方法

    <style> p{ /*font-style: italic;/*设置字体为斜体*/ font-variant: small-caps; font-weight: bolder;/*设置 ...

  2. Winform 5种皮肤小结(内含丰富的下载实例)

    软件界面就是指软件中面向操作者而专门设计的用于操作使用及反馈信息的指令部分. 优秀的软件界面有简便易用,突出重点,容错高等特点. 1.东日IrisSkin  使用IrisSkin只能是对单一的控件重绘 ...

  3. javascript中对编码的解读

    首先来一下js知识的巩固与复习 js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,deco ...

  4. nginx 配置简单的静态页面

    nginx 文件服务配置,MIME和 default_type https://blog.csdn.net/qq_26711103/article/details/81116900 nginx 静态页 ...

  5. shell 中执行Oracle查询和执行存储过程

    [oracle@master2 test]$ more b.sh #!/bin/sh #数据库地址 ip=192.168.1.250 port sid=orcl username=c##scott p ...

  6. asyncio:python3未来并发编程主流、充满野心的模块

    介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...

  7. deep_learning_Function_One-host参数

    在很多机器学习任务中,特征并不总是连续值,而有可能是分类值.比如星期类型,有星期一.星期二.…….星期日,比如浏览器类型有["uses Firefox", "uses C ...

  8. 九,configMap及secret的基本使用

    目录 制定容器配置的方式 configMap(存储数据为明文,敏感数据慎用) 创建configMap的几种方式 命令行创建和测试configMap实例 创建一个Pod 挂载测试 通过指定文件创建con ...

  9. 在Linux中,当需要从磁盘读取块时,进程状态会发生什么变化?被封锁了吗?如果是这样,如何选择另一个流程来执行?

    当某个进程需要从磁盘中获取数据时,它实际上会停止在CPU上运行以让其他进程运行,因为该操作可能需要很长时间才能完成-至少需要5ms的磁盘寻道时间,而5ms就是1000万从程序的角度来看,CPU周期是永 ...

  10. Java入门 异常处理

    Java入门 异常处理 1.处理异常(try-catch以及try-catch-finally): a)try会抛出很多种类型的异常-多重catch块的处理 eg:try{ //一些会抛出异常的方法 ...