dup()系統呼叫

2puT發表於2016-07-09
今天看到dup和dup2系統呼叫,目前還不是太理解,先寫一點簡單的應用例項。

dup和dup2用來複制檔案描述符。

函式原型:
#include
int dup(int oldfd);
int dup2(int oldfd,int newfd);


       dup用來複制oldfd所指的檔案描述符。但複製成功時返回最小的尚未被使用的檔案描述符。若有錯誤則返回-1,錯誤程式碼存入errno中。返回的新檔案描述符和引數oldfd指向同一個檔案,共享所有的鎖定,讀寫指標,和各項許可權或標誌位。
       dup2可以用引數newfd指定新檔案描述符的數值。若newfd已經被程式使用,系統就會將其關閉以釋放該檔案描述符;若newfd與oldfd相等,dup2將返回newfd,而不關閉他。dup2呼叫成功返回新的檔案描述符,出錯則返回-1。

      標準輸入(stdin),標準輸出(stdout),標準出錯資訊(stderr)的檔案號分別為0,1,2

一個簡單的例子:首先在當前目錄下存在一個檔案mytest2,檔案內容為hhhhhhhhhhhh
 
#include
#include
#include
#include
#include
#include

 int main()
 {
   int oldfd;

   oldfd = open("mytest2",O_RDWR|O_CREAT,0644);
   dup2(oldfd,1);   //複製oldfd到檔案描述符1(stdout標準輸出)
   close(oldfd);    //關閉檔案描述符oldfd
   printf("ddd");  //在標準輸出上列印出ddd,這時由於標準輸出已經被oldfd檔案描述符代替
   return 0;       //列印到標準輸出上的內容就全部列印到了檔案mytest2中
 }

程式執行結果為檔案mytest2中的內容變為:dddhhhhhhhhh

程式例項:檔名為file5.c

#include
#include
#include
#include
#include
#include

int main()
{
 int fd;
 int i;
 if((fd=open("mytest3",O_CREAT|O_RDWR,0644))==-1){
      printf("open file error!");     
      exit(1);
  }

 close(1);  //關閉標準輸出
 dup(fd);  // 複製檔案描述符fd到1上
 close(fd);

 printf("writ to file\n");
 return 0;   
}

程式執行時結果:
moalong@xiyoulinux-desktop:~/along/code/c/part5$ make file5
cc     file5.c   -o file5
moalong@xiyoulinux-desktop:~/along/code/c/part5$ ./file5
moalong@xiyoulinux-desktop:~/along/code/c/part5$ cat mytest3
writ to file

相關文章