千家信息网

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

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,dup/dup2dup/dup2是两个用于指定文件操作符的方法,作用很相似,它是得两个文件描述符指向同一个file结构体,使file的引用计数为2,所以在使用的时候我们需要手动关闭另外一个不需要的。d
千家信息网最后更新 2025年02月23日高级I/O-----dup/dup2

dup/dup2

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

dup:

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

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


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

  1 #include  2 #include  3 #include  4 #include  5 #include  6 #include  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 2 #include 3 #include 4 #include 5 #include 6 #include 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一样



总结:

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

0