dup操作

功能:复制文件描述符,重定向输入输出。
函数:

#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);返回值:成功:dup函数返回当前系统可用的最小整数值。dup2函数返回第一个不小于newfd的整数值,分两种情况:1. 如果newfd已经打开,则先将其关闭,再复制文件描述符;2. 如果newfd等于oldfd,则dup2函数返回newfd,而不关闭它。失败:dup和dup2函数均返回-1,并设置errno。

复制文件描述符后,新旧文件描述符的特点:

1、使用dup或dup2复制文件描述符后,新文件描述符和旧文件描述符指向同一个文件,
管道或网络连接,共享文件的锁定、读写位置和各项权限。
2、当关闭新的文件描述符时,通过旧文件描述符仍可操作文件。
3、当关闭旧的文件描述符时,通过新的文件描述符仍可操作文件。

注意:
是共享文件偏移量和文件状态标志。
比如:其中一个使用lseek修改文件偏移量,另一个也会改变(读写等操作位置会改变)。

/* 例子:复制文件描述符,并向文件写数据 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>void main()
{int oldfd,newfd;char *oldstr = "Write by oldfd.\n";char *newstr = "Write by newfd.\n";oldfd = open("test.txt", O_RDWR|O_CREAT, 0644);printf("oldfd = %d\n", oldfd);if(oldfd == -1) {printf("File open error\n");exit(-1); }/* 开始复制 */newfd = dup(oldfd);printf("newfd = %d\n", newfd);/* 使用oldfd写 */write(oldfd, oldstr, strlen(oldstr));if(close(oldfd) == -1) {printf("Close oldfd error.\n");exit(-1);}/* 使用newfd写 */write(newfd, newstr, strlen(newstr));if(close(newfd) == -1) {printf("Close newfd error.\n");exit(-1);}exit(0);
}

执行结果

终端输出:
oldfd = 3
newfd = 4查看test.txt:
Write by oldfd.
Write by newfd.

注意:新旧文件描述符是共享文件读写位置。

unix:dup与dup2函数详解相关推荐

  1. linux c——dup( )和dup2( )函数详解

    dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下. 1. dup函数 头文件及函数定义: #include <unistd.h ...

  2. unix环境高级编程之 read与write 函数详解

    学习记录:unix环境高级编程之 read 与write  函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...

  3. Linux 文件锁 fcntl 函数详解

    Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  4. linux内核中send与recv函数详解

    Linux send与recv函数详解 1.简介 #include <sys/socket.h> ssize_t recv(int sockfd, void *buff, size_t n ...

  5. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  6. mysql日期时间操作函数详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...

  7. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...

  8. gets和fgets函数及其区别,C语言gets和fgets函数详解

    gets和fgets函数及其区别,C语言gets和fgets函数详解 每当讨论 gets 函数时,大家不由自主地就会想起 1988 年的"互联网蠕虫",它在 UNIX 操作系统的 ...

  9. execvp函数详解_如何在C / C ++中使用execvp()函数

    execvp函数详解 In this article, we'll take a look at using the execvp() function in C / C++. 在本文中,我们将介绍如 ...

最新文章

  1. Windows Live Writer发布测试
  2. JavaScript学习笔记 - 入门篇(1)- 准备
  3. ruby on rails 学习笔记
  4. 窗体和控件使用中的注意事项有哪些?
  5. POJ1321 棋盘问题
  6. MyDAL - .IsExistAsync() 使用
  7. linux修改jdk环境变量6,Linux CentOS 6.5 使用自带jdk修改环境变量(示例代码)
  8. 【修饰符】四种访问修饰符和各自的权限
  9. pthread_t描述说明
  10. jackson 序列化_jackson序列化与反序列化的应用实践
  11. 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
  12. 史上最详 Thymeleaf 使用教程
  13. 上海电力学院linux大作业,上海电力电路大作业2重点.docx
  14. 微信公众号H5支付遇到的那些坑
  15. 计算机二级office高级应用教程,2015计算机二级Office高级应用上机试题及答案
  16. php推荐位调用,推荐位数据循环调用
  17. matlab画收敛域,第二章习题与答案1.求以下序列的z变换并画出零极点图和收敛域.doc...
  18. VIP邮箱哪个最好用?怎么申请163电子邮箱?
  19. Glide,AndroidX包兼容问题
  20. 超好的包体积优化教程,不仅仅是优化

热门文章

  1. Funnel Activation for Visual Recognition(FReLU)
  2. [SpaceVim] 安装SpaceVim
  3. 【项目2:电机控制项目】 之 【4.硬件 - 电源软启动电路】
  4. JAVA常见异常信息(保存)
  5. 平面中判断线段与矩形是否相交
  6. 读取PPT模板替换数据生成PDF报表
  7. AD设置1:1打印出PCB图纸
  8. 【Vue3】Vue的事件类型
  9. 年前用Python,选出好基金,稳赚一笔
  10. Python 下划线 单下划线 双下划线的作用