dup & dup2

来源:互联网 发布:桌面总是出现精选淘宝 编辑:程序博客网 时间:2024/06/06 03:53

说明:

part.0 :原创

part.1:转载

part.2:转载

part.3:原创

-------------part.0----------------------

int dup(int oldfd);

//创建一个newfd,newfd指向oldfd的位置,并且dup返回的文件描述符总是取系统当前可用的最小整数值

int dup2(int oldfd, intnewfd);

//将已有的一个newfd重定向到oldfd的位置,返回第一个不小于oldfd的整数值

-------------part.1----------------------

链接:http://blog.csdn.net/fucangzxx/article/details/52056215

-------------part.2----------------------

链接:http://blog.csdn.net/kangear/article/details/24098315

代码如下:

[cpp] view plain copy
  1. #include <stdio.h>;  
  2. #include <unistd.h>;  
  3. #include <stdlib.h>;  
  4. #include <fcntl.h>;  
  5. #include <sys/types.h>;  
  6. #include <sys/stat.h>;  
  7. #include <string.h>;  
  8. #include <strings.h>;  
  9.   
  10. int main()  
  11. {  
  12.         int sfd = dup(STDOUT_FILENO), testfd;  
  13.   
  14.         printf("sfd = [%d]\n", sfd);  
  15.   
  16.         testfd = open("./temp",O_CREAT | O_RDWR | O_APPEND);  
  17.         if (-1 == testfd)  
  18.         {  
  19.                 printf("open file error.\n");  
  20.                 exit(1);  
  21.         }  
  22.   
  23.         /* 重定向 */  
  24.         if (-1 == dup2(testfd,STDOUT_FILENO) ) {  
  25.                 printf("can't redirect fd error\n");  
  26.                 exit(1);  
  27.         }  
  28.   
  29.         /* 此时向stdout写入应该输出到文件 */  
  30.         write(STDOUT_FILENO,"file\n",5);  
  31.   
  32.         /* 恢复stdout */  
  33.         if (-1 != dup2(sfd,STDOUT_FILENO) ) {  
  34.                 printf("recover fd ok \n");  
  35.   
  36.                 /* 恢复后,写入stdout应该向屏幕输出 */  
  37.                 write(STDOUT_FILENO,"stdout\n",7);  
  38.         }  
  39.   
  40.         printf("gogogogogogo!\n");  
  41.         close(testfd);  
  42. }  

     总结:重定向好似抗战片中的将铁轨移到别的路上,或者走向深谷/dev/null,或者走向想让其走的地方fd。再说下,一开始以为我还以为dup2(STDOUT_FILENO, STDOUT_FILENO);就恢复了呢,结果关闭fd时候,显示关闭成功,但是设备却再也打不开了,因为我并没有真正还原。


-------------part.3----------------------


分析:

第一步: newfd(3)=dup(  oldfd(1)  );               //newfd  > oldfd

第二步:newfd(1)=dup2( oldfd(4), newfd(1)  ); //newfd  > oldfd

第三部:newfd(1)=dup2( oldfd(3), newfd(1) );  //newfd  > oldfd