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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级I/O-----dup/dup2相关的知识,希望对你有一定的参考价值。

dup/dup2

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

dup:

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

       #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);


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

  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"
  8 
  9 
 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 #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"
 8 
 9 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一样



总结:

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

本文出自 “痕迹” 博客,请务必保留此出处http://wpfbcr.blog.51cto.com/10696766/1784970

以上是关于高级I/O-----dup/dup2的主要内容,如果未能解决你的问题,请参考以下文章

WPF高级编程的目录

高级特性- 高级Swing

Gorm 高级查询

Message发送之高级特性(二)

RabbitMQ高级特性(2)

第七章 高级查询