我們都知道,一個進(jìn)程在存在期間,會有一些文件被打開,從而會返回一些文件描述符,從shell中運行一個進(jìn)程,默認(rèn)會有3個文件描述符存在,即0,1,2.0與進(jìn)程的標(biāo)準(zhǔn)輸入相關(guān)聯(lián),1與進(jìn)程的標(biāo)準(zhǔn)輸出相關(guān)聯(lián),2與進(jìn)程的標(biāo)準(zhǔn)輸出錯誤相關(guān)聯(lián)。
dup和dup2函數(shù)用來復(fù)制一個文件的描述符,用于文件描述符的重定向,重定向一個進(jìn)程的0,1,2文件描述符。這兩個函數(shù)的原型如下:
int dup(int oldfd);
int dup2(int oldfd,int newfd);
利用dup函數(shù),我們可以復(fù)制一個文件描述符,傳給該函數(shù)一個既有的描述符,它就會返回一個新的描述符,這個新的描述符是傳給它的舊描述符的拷貝,這意味著這兩個文件描述符共享同一個數(shù)據(jù)結(jié)構(gòu),即所有的鎖定,讀寫指針,各項權(quán)限和標(biāo)志位等等。但復(fù)制成功時返回最小的尚未被使用的文件描述符,這個文件描述符指向oldfd所擁有的文件表項,例如,假如oldfd的值為1,當(dāng)前文件文件描述符的最小值為3,那么新描述符3指向描述符1所擁有的文件表項。出錯返回-1,錯誤代碼在errno中。
dup2函數(shù)可以用參數(shù)newfd指定新文件描述符的數(shù)值,若newfd已經(jīng)被程序使用,系統(tǒng)就會將其關(guān)閉以釋放該文件描述符。若newfd與oldfd相等,dup2將返回newfd,而不關(guān)閉它。dup2調(diào)用成功返回新的文件描述符,出錯返回-1.dup2函數(shù)可以讓用戶自己指定文件描述符,它的作用也是復(fù)制文件描述符,將newfd描述符所對應(yīng)的文件表改成oldfd所對應(yīng)的文件表項。之后,newfd與oldfd指向同一個文件表,這樣就將newfd重定向到oldfd。
dup和dup2的區(qū)別就是可以用newfd參數(shù)指定新描述符的數(shù)值,如果newfd已經(jīng)打開,則先將其關(guān)閉,如果newfd等于oldfd,則dup2返回newfd而不關(guān)閉它。
下面我們來看看一段有關(guān)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; }
運行結(jié)果如下:
我們可以看到,當(dāng)沒有close(1)的時候,新open的文件描述符是3,當(dāng)我們close(1)后并調(diào)用dup函數(shù)后,new_fd變成了1,本來將要輸出到終端的內(nèi)容被重定向到了log文件里。
dup2函數(shù)示例:
#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);//復(fù)制oldfd到文件描述符1(標(biāo)準(zhǔn)輸出) 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; }
運行結(jié)果如下:
從結(jié)果可以看到,我們從標(biāo)準(zhǔn)輸入輸入的數(shù)據(jù)全都被重定向到了log文件里面了。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
名稱欄目:dup和dup2函數(shù)-創(chuàng)新互聯(lián)
本文鏈接:http://www.chinadenli.net/article0/dpdjoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、域名注冊、全網(wǎng)營銷推廣、外貿(mào)建站、營銷型網(wǎng)站建設(shè)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容