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);

dup2与dup区别是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. Linux:dup/dup2 文件描述符重定向函数(有图有代码有真相!!!)

    一.dup/dup2 有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接.系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号 ...

  2. 进程间通信管道进阶篇:linux下dup/dup2函数的用法

    由于利用管道实现进程间通信,是通过创建两个文件描述符,但是描述符的初始化是通过随机的,就是从可用的文件描述符中取出,并将可用的文件描述符与file对象相关联,如果我们需要将管道的两头与其他的流相关时, ...

  3. linux dup跨进程使用,linux下dup/dup2函数的用法

    系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新 ...

  4. dup, dup2, 重定向恢复

    做Shell lab的时候要求完成重定向以及恢复,这里记录一下相关知识 #include <unistd.h> int dup(int oldfd); dup用来复制参数oldfd所指的文 ...

  5. dup/dup2重定向

    在linux编程中经常会看到stdin.stdout.stderr,他们的含有分别表示标准输入.标准输出.标准错误输出.三个系统文件的文件标识符分别用0.1.2表示. stdin 0 stdout 1 ...

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

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

  7. linux中dup2函数,Linux 下的 dup 和 dup2 函数简介

    dup 和 dup2 都可以用来复制一个现存的文件描述符.经常用来重新定向进程的 STDIN, STDOUT, STDERR. dup 函数 dup 函数定义在 中,函数原形为: int dup ( ...

  8. linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2

    Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...

  9. 九、Linux之dup和dup2函数

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

最新文章

  1. 如何对512M内存的vps apache进行优化配置(perfork模式)
  2. SylixOS中select原理及使用分析
  3. 属性面板 脚本_如何在组态王中实现同类型设备公用操作面板的调用---干货
  4. 为什么eolinker发送老是等待_eolinker之初体验
  5. RGB图像任意角度旋转
  6. vue一个页面用两个以上页面 时时刷新
  7. BeetlSQL 注解
  8. 微信小程序navigate标签
  9. 苹果内购后台(java)验证订单
  10. 百练 4118 开餐馆
  11. chainWebpack配置WebWorkers
  12. python录入数据至ppt_利用Python进行数据分析之 数据加载.ppt
  13. Linux环境部署Node.js
  14. 对称加密和非对称加密的特点
  15. 一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井
  16. 张艾迪Eidyzhang:解码天才Eidyzhang的诞生
  17. 有一定基础的 C++ 学习者该如何学习 Windows 编程?
  18. 自学Python需要多长时间从入门到精通?
  19. 斯伦贝谢和IBM宣布推出面向能源行业的混合云企业数据管理解决方案
  20. 考研数据结构之完全二叉树的构造及先序遍历递归算法

热门文章

  1. 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
  2. Openstack 中的消息总线 AMQP
  3. 使用MQTT.fx(mqttfx软件)接入阿里云
  4. lcd参数解释及刷新率计算,LCD时序
  5. Altium Designer铺铜时抠铜
  6. 嵌入式驱动之阻塞操作、非阻塞操作
  7. JVM中线程是否可以并行执行
  8. Material Design(十一)--CoordinatorLayout和自定义视图
  9. CSS核心内容整理 - (中)
  10. 对使用Jolt调用Tuxedo的一个简单的封装