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. java线程阻塞唤醒的四种方式
  2. react native 从头开始
  3. pom.xml中的artifactId是什么意思?
  4. ubus c语言例子,openwrt之ubus例子
  5. thinkphp 视图(一)
  6. Java实现求二叉树的路径和
  7. asterisk积累命令
  8. JDBC和JPA调用储存过程 接收存储过程有返回值
  9. [Jobdu] 题目1037:Powerful Calculator
  10. Apache Qpid Proton 0.16.0,轻量通信库
  11. HyperLogLog浅析
  12. 安装Realtek RTL8111/RTL8168网卡驱动详解(error~eth0:no such device)
  13. 应用Matlab小波变换工具箱进行图像压缩
  14. document和document.documentElement的区别
  15. 微软官方Windows7 Ultimate with SP1 DVD 官方简体中文原版下载
  16. 类似京东淘宝历史搜索自适应长度搜索项超两行折叠功能实现
  17. Linux系统之iftop的基本使用
  18. [开关电源]浪涌电流有点高?我来给你支支招
  19. 电脑端上有哪些免费好用的思维导图软件?
  20. linux otg u盘,如何使用OTG手机功能U盘?

热门文章

  1. 整理了27个Python人工智能库,建议收藏
  2. 华为mate9mate10升级鸿蒙,华为Mate10对比华为Mate9:有哪些升级?
  3. 计算机专业,应该学习前端还是后端?具体有什么不一样?
  4. 计算机方法欧拉,欧拉方法详解
  5. PMO和项目经理如何设计全项目周期绩效激励方案
  6. 使用feign远程调用接口
  7. Python一些可能用的到的函数系列28 超大文本文件分割读取
  8. c++ getpid函数_C Linux中的getpid()和getppid()函数
  9. 案例研究:从《极简法则》看瑞幸咖啡
  10. 零点工作室暑假集训(AtCoder--ABC277)