高级I/O-----dup/dup2

原创 2016年05月31日 21:42:41

dup/dup2


dup/dup2是两个用于指定文件操作符的方法,作用很相似,它是得两个文件描述符指向同一个file结构体,使file的引用计数为2,所以在使用的时候我们需要手动关闭另外一个不需要的。

dup:

dup的作用是将文件描述符指向一个最小的文件描述符。

1
2
3
4
       #include <unistd.h>
 
       int dup(int oldfd);
       int dup2(int oldfd, int newfd);


因为比较简单,就从代码来看吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/socket.h>
  4 #include<string.h>
  5 #include<fcntl.h>
  6 #include<unistd.h>
  7 #define _PATH_ "./test.log"
  
  
 10 int main()
 11 {
 12     umask(0);
 13     int fd=open(_PATH_,O_CREAT|O_WRONLY,0644);//打开一个新的文件
 14     if(fd<0)
 15     {
 16         perror("open");
 17     }
 18     close(1);//关掉需要用dup指向的文件描述符,注意(dup会使fd指向一个未使用的最           //小的文件描述符)
 19     int new_fd=dup(fd);//现在1号文件描述符指向刚才open的文件
 20     close(fd);   //关闭之前open的文件描述符,如果不关闭,则从fd中也能网文件                               //里写。
 21     char buf[1024];
 22     while(1)
 23     {
 24         memset(buf,'\0',sizeof(buf));
 25         ssize_t size=read(0,buf,sizeof(buf)-1);
 26         if(size>0)
 27         {
 28             buf[size]='\0';
 29         }
 30         if(strncmp(buf,"quit",4)==0)
 31         {   
 32             break;
 31         {
 32             break;
 33         }
 34         printf("%s",buf);//printf会输出到1号文件描述符中
 35         fflush(stdout);
 36     }
 37     close(1);
 38     return 0;
 39 }

效果图






dup2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<sys/socket.h>
 4 #include<string.h>
 5 #include<fcntl.h>
 6 #include<unistd.h>
 7 #define _PATH_ "./test.log"
 
 int main()
 10 {
 11     umask(0);
 12     int fd =open(_PATH_,O_CREAT|O_WRONLY,0644);
 13     if(fd<0)
 14     {
 15         perror("open");
 16     }
 17     close(1); //使用dup2所使用的重定向到的文件描述符必须先关闭
 18     int newfd=dup2(fd,1);
 19     close(fd);//关闭fd现在只有1号文件描述符指向所open的文件
 20     char buf[1024];
 21     printf("%d\n",newfd);
 22     while(1)
 23     {
 24         memset(buf,'\0',sizeof(buf));
 25         fgets(buf,sizeof(buf)-1,stdin);
 26         if(strncmp(buf,"quit",4)==0)
 27         {
 28             break;
 29         }
 30         printf("%s",buf);
 31         fflush(stdout);
 32     }
 33     return 0;
 34 }

结果和dup一样



总结:

当需要往标准输出上打的调试信息,可以使用重定向的方式让它输出到相应的文件中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

重定向编程 dup和dup2函数

重定向编程 dup和dup2函数    函数dup和dup2提供了复制文件描述符的功能。他们通常用于stdin,stdout或进程的stderr的重定向。一般来说,普通输出函数(如:printf),...
  • u010006102
  • u010006102
  • 2014年09月29日 11:53
  • 1972

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出?? http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=359433&page=

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出?? [复制链接] 00 dysnake 稍有积蓄 ...
  • wangyin159
  • wangyin159
  • 2015年09月11日 22:18
  • 1157

dup/dup2输出重定向

有时我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接。 dup()与dup2()能对输入文件描述符进行重定向。 int dup(int oldfd); int dup2(int ...
  • fucangzxx
  • fucangzxx
  • 2016年07月28日 17:11
  • 2044

使用dup和dup2重定向和还原

使用dup和dup2重定向和还原 源于开发一个应用将数据写的设备节点中,但是设备节点具有可变性,所以不在写死,而是先确定好,打开fd再将内容写进去,最终写入fd中的是一个开源程序,没有办法传递fd,不...
  • kangear
  • kangear
  • 2014年04月19日 11:12
  • 11163

linux之dup和dup2函数解析

本文转载,原文地址:http://blog.csdn.net/fulinus/article/details/9669177#comments1、文件描述符在内核中数据结构  在具体说dup/dup2...
  • silent123go
  • silent123go
  • 2017年05月03日 11:27
  • 1801

dup和dup2的使用方法

/*本文通过标准输出的重定向和恢复的过程来解释dup和dup2的使用方法*/ #include #include #include //STDIN_FILENO标准输入描述符(0) //STD...
  • lurendetiankong
  • lurendetiankong
  • 2016年12月06日 15:16
  • 1413

Unix环境高级编程 写dup2功能相同的函数

题目 3.2 Write your own dup2 function that performs the same service as the dup2 function described i...
  • bitowang
  • bitowang
  • 2013年03月28日 18:12
  • 1186

linux学习之十八---管道pipe&dup&dup2

1.管道的用法: 进程在使用fork函数创建子进程前先创建一个管道,该管道用于在父子进程间通信,然后创建子进程,之后父进程关闭管道的读端,子进程关闭管道的写端。父进程负责向管道写数据而子进程负责读数...
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年11月10日 15:25
  • 1517

AT4REPatcher 0.63汉化版本 和 108个皮肤(完全自制)

AT4RE Patcher是一款强大额补丁制作生成工具,有很多破解补丁就是这个工具生成。AT4RE Patcher生成补丁比较简单只要指定原始程序和修改后的程序就会自动比较搜索提取相关数据,还支持添加...
  • lovedeadyou
  • lovedeadyou
  • 2016年10月26日 11:34
  • 839

Java中的高级I/O流-缓冲流、数据流以及对象流

Java中的高级I/O流-缓冲流、数据流以及对象流 前言:通过前面的学习,已经学完了Java中的基本流;Java中的流有字节流和字符流两大类,而每一种流都有对应的输入和输出流; 1、字节流 1...
  • BlueSky_USC
  • BlueSky_USC
  • 2016年11月28日 22:25
  • 1388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高级I/O-----dup/dup2
举报原因:
原因补充:

(最多只允许输入30个字)