dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下。

1、 dup函数
头文件及函数定义:

#include <unistd.h>
int dup(int oldfd);
  • dup用来复制参数oldfd所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符,若有错误则返回-1.错误代码存入errno中返回的新文件描述符和参数oldfd指向同一个文件,这两个描述符共享同一个数据结构,共享所有的锁定,读写指针和各项全现或标志位。

调用dup(oldfd)等效于
fcntl(oldfd, F_DUPFD, 0)

代码示例:

#include<stdio.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc, char* argv[])
{int fd=open("text.txt", O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);if(fd < 0){printf("Open Error!\n");return 0;}int fd2=dup(fd);if(fd2<0){printf("Error!\n");return 0;}char buf[1000];int n;while((n=read(STDIN_FILENO, buf,1000)) > 0)  //接受键盘输入,并将其存入buf所指向的缓存中   {if(write(fd2, buf, n)<n)    //将buf所指向的缓存区的n个字节的数据写入到由文件描述符fd2所指示的文件中{printf("Write Error!!\n");return 0;}}return 0;
}

STDIN_FILENO:接收键盘的输入

STDOUT_FILENO:向屏幕输出

运行结果:

从代码结果可以看出fd这个描述符指向text.txt,然后调用dup函数对 fd进行拷贝,拷贝到d2,然后write(fd2,buf,n)这句将从键盘输入到buf所指的缓冲区的数据写到 fd2所指向的文件后。所以我们在查看text.txt,看到了我们输入的东西。

2、dup2函数
头文件及其定义:

 #include <unistd.h>int dup2(int oldfd, int newfd);
  • dup2dup区别是dup2可以用参数newfd指定新文件描述符的数值。若参数newfd已经被程序使用,则系统就会将newfd所指的文件关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等.
  • 返回值:
    若dup2调用成功则返回新的文件描述符,出错则返回-1.

dup2(oldfd, newfd)等效于
close(oldfd);
fcntl(oldfd, F_DUPFD, newfd);
在shell的重定向功能中,(输入重定向”<”和输出重定向”>”)就是通过调用dup或dup2函数对标准输入和标准输出的操作来实现的。

代码示例:

#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>void main()
{int oldfd;int fd;int t;char *buf="This is a test!!!!\n";if((oldfd=open("mine.txt",O_RDWR|O_CREAT,0644))==-1){printf("open error\n");exit(-1);}fd=dup2(oldfd,fileno(stdout));if(fd==-1){printf("dup2 error\n");exit(-1);}printf("dup2的返回值:%d\n",fd);t=strlen(buf);if(write(fileno(stdout),buf,t)!=t)//本应该写入到stdout的信息,但是标准输出已经重定向到目标文件中,故向标准输出写的数据将会写到目标文件中。{printf("write error!\n");exit(-1);}close(fd);exit(0);
}

运行结果:

从运行结果看到本应该输出到屏幕的信息,但是标准输出已经重定向到目标文件中,故向标准输出写的数据写到了mine.txt中。

linux c——dup( )和dup2( )函数详解相关推荐

  1. unix:dup与dup2函数详解

    dup操作 功能:复制文件描述符,重定向输入输出. 函数: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int ...

  2. 【Linux系统编程】vfork() 函数详解

    00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...

  3. 【Linux系统编程】fork()函数详解

    00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...

  4. 转:linux中fork()函数详解

    转:linux中fork()函数详解 https://blog.csdn.net/jason314/article/details/5640969 转载于:https://www.cnblogs.co ...

  5. linux文件重定向 dup,linux之dup和dup2函数解析

    linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户 ...

  6. 九、Linux之dup和dup2函数

    九.Linux之dup和dup2函数 目录: 九.Linux之dup和dup2函数 一.重定向 二.dup()函数原型(dup--duplicate) int dup(int oldfd); 三.du ...

  7. Linux系统调用-- recv/recvfrom/recvmsg函数详解(转)

    Linux系统调用-- recv/recvfrom/recvmsg函数详解 2007-09-10 23:37 [recv/recvfrom/recvmsg系统调用]   功能描述: 从套接字上接收一个 ...

  8. linux Socket send与recv函数详解

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

  9. linux内核中的hook函数详解,linux内核中的hook函数详解

    在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...

最新文章

  1. python编程100例画图-python 画图示例源码(Turtle Graphics)
  2. 设置root密码,su与sudo的区别
  3. poj 1737男人八题之一 orz ltc
  4. 轮播插件swiper.js?
  5. AzCopy – 上传/下载 Windows Azure Blob 文件
  6. Java基础---认识正则表达式
  7. Springboot整合Nacos配置中心
  8. Qt4_子类化QMainWindow
  9. Eclipse JSP 页面设置 charset=UTF-8
  10. 亚马逊云平台采集转单机采集实现
  11. 编曲软件FL Studio 20.99中文版2023最新免费下载
  12. 软件测试记录包括哪些,bug记录里通常包括哪些内容?
  13. 【洛谷P4568】飞行路线【分层图最短路】
  14. 赵小楼《天道》《遥远的救世主》深度解析(45)肖亚文为什么最后能成为最大的受益者?
  15. ios10 上下黑边问题
  16. 《Accurate eye center localisation by means of gradients》论文阅读
  17. 如何在配置低的老旧笔记本的win7系统上安装tensorflow及报错信息解决方法集锦
  18. 看盘做短线的10种方法(转)
  19. 图片文字识别工具调研
  20. java.lang.ClassNotFoundException: Didn't find class com.test.test.activity.MainActivity

热门文章

  1. Quartz (1) 入门例子
  2. 互联网摸鱼日报(2023-02-09)
  3. 【 I.MX6U-ALPHA 】嵌入式Linux Ubuntu系统入门系列(二)Ubuntu 系统入门
  4. 微积分 --- 欧拉公式(个人学习笔记)
  5. ad19电气规则检查_AD中DRC规则检查中英文对照
  6. UBUNTU——卸载各类软件
  7. 基于jsp的影视创作论坛系统毕业设计(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
  8. Android之手机通知栏Notification的使用(二)
  9. Robin谈早期点石博客的优化策略
  10. OpenCV基础(22)使用OpenCV生成及读取二维码以及与Zbar比较