dup和dup2函數-創(chuàng)新互聯

我們都知道,一個進程在存在期間,會有一些文件被打開,從而會返回一些文件描述符,從shell中運行一個進程,默認會有3個文件描述符存在,即0,1,2.0與進程的標準輸入相關聯,1與進程的標準輸出相關聯,2與進程的標準輸出錯誤相關聯。

創(chuàng)新互聯建站制作網站網頁找三站合一網站制作公司,專注于網頁設計,做網站、成都網站制作,網站設計,企業(yè)網站搭建,網站開發(fā),建網站業(yè)務,680元做網站,已為成百上千家服務,創(chuàng)新互聯建站網站建設將一如既往的為我們的客戶提供最優(yōu)質的網站建設、網絡營銷推廣服務!

      dup和dup2函數用來復制一個文件的描述符,用于文件描述符的重定向,重定向一個進程的0,1,2文件描述符。這兩個函數的原型如下:

      int dup(int oldfd);

      int dup2(int oldfd,int newfd);

      利用dup函數,我們可以復制一個文件描述符,傳給該函數一個既有的描述符,它就會返回一個新的描述符,這個新的描述符是傳給它的舊描述符的拷貝,這意味著這兩個文件描述符共享同一個數據結構,即所有的鎖定,讀寫指針,各項權限和標志位等等。但復制成功時返回最小的尚未被使用的文件描述符,這個文件描述符指向oldfd所擁有的文件表項,例如,假如oldfd的值為1,當前文件文件描述符的最小值為3,那么新描述符3指向描述符1所擁有的文件表項。出錯返回-1,錯誤代碼在errno中。

      dup2函數可以用參數newfd指定新文件描述符的數值,若newfd已經被程序使用,系統就會將其關閉以釋放該文件描述符。若newfd與oldfd相等,dup2將返回newfd,而不關閉它。dup2調用成功返回新的文件描述符,出錯返回-1.dup2函數可以讓用戶自己指定文件描述符,它的作用也是復制文件描述符,將newfd描述符所對應的文件表改成oldfd所對應的文件表項。之后,newfd與oldfd指向同一個文件表,這樣就將newfd重定向到oldfd。

      dup和dup2的區(qū)別就是可以用newfd參數指定新描述符的數值,如果newfd已經打開,則先將其關閉,如果newfd等于oldfd,則dup2返回newfd而不關閉它。

下面我們來看看一段有關dup的代碼:

#include <stdio.h>
   #include <stdlib.h>
   #include <errno.h>
   #include <unistd.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <fcntl.h>
   
   #define _FILE_ "./log"
  
  int main()
  {
      umask(0);
      int fd=open(_FILE_,O_CREAT |O_WRONLY,0644);
      printf("%d\n",fd);
      if(fd<0)
      {
          perror("open");
          return 1;
      }
      close(1);
      int new_fd=dup(fd);                                                                                                                                             
      if(new_fd<0)
      {
          perror("dup");
          return 2;
      }
  
      close(fd);
      printf("new_fd:%d\n",new_fd);
      int count=0;
      while(count++<100)
      {
          printf("hello world\n");
          fflush(stdout);
      } 
      close(new_fd);
      return 0;
  }

運行結果如下:

dup和dup2函數

      我們可以看到,當沒有close(1)的時候,新open的文件描述符是3,當我們close(1)后并調用dup函數后,new_fd變成了1,本來將要輸出到終端的內容被重定向到了log文件里。

dup2函數示例:

#include <stdio.h>
   #include <stdlib.h>
   #include <unistd.h>
   #include <sys/types.h>
   #include <sys/stat.h>
   #include <fcntl.h>
   #include <string.h>
   
   
  #define _FILE_ "./log"
  
  int main()
  {
      umask(0);
      int fd=open(_FILE_,O_CREAT |O_WRONLY,0644);
      if(fd<0)
      {
          perror("open");
          exit(0);
      }
  
      close(1);
      int ret=dup2(fd,1);//復制oldfd到文件描述符1(標準輸出)
      if(ret<0)
      {
          perror("dup2");                                                                                                                                             
          exit(1);
      }
      char buf[1024];
      int done=0;
      while(!done)
      {
          memset(buf,'\0',sizeof(buf));
          ssize_t _s=read(0,buf,sizeof(buf)-1);
          if(_s<=0)
          {
              perror("read");
              exit(2);
          }
          else if(_s>0)
          {
              buf[_s]='\0';                                                                                                                                           
              if(strncmp(buf,"quit",4)==0)
              {
                  done=1;
                  continue;
              }
          }
          printf("%s\n",buf);
          fflush(stdout);
      }
      return 0;
  }

運行結果如下:

dup和dup2函數

從結果可以看到,我們從標準輸入輸入的數據全都被重定向到了log文件里面了。                                                                                                                              

創(chuàng)新互聯www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現已開啟,新人活動云服務器買多久送多久。

名稱欄目:dup和dup2函數-創(chuàng)新互聯
本文鏈接:http://bm7419.com/article0/dpdjoo.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站策劃域名注冊、全網營銷推廣外貿建站、營銷型網站建設定制開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

小程序開發(fā)