重定向程式設計 dup和dup2函式

2021-08-21 06:55:42 字數 1718 閱讀 1669

輸入重定向:關閉標準輸入裝置,開啟(或複製)某普通檔案,使其檔案描述符為0.

輸出重定向:關閉標準輸出裝置,開啟(或複製)某普通檔案,使其檔案描述符為1.

錯誤輸出重定向:關閉標準錯誤輸入裝置,開啟(或複製)某普通檔案,使其檔案描述符為2.

1.dup函式

返回值:如成功則返回新的檔案描述符,否則出錯返回-1.注意:由dup函式返回的新檔案描述符一定是當前可用檔案描述符中的最小值。

ebadf:引數fd非有效的檔案描述符,或該檔案已關閉。

假設程序執行了:newfd = dup(1);

當此函式執行時,假定下乙個可用的檔案描述符是3.因為兩個描述符指向同乙個檔案表項,所以他們共享同一檔案狀態標誌以及同一當前檔案偏移量。如圖1所示。

圖1 複製檔案描述符的核心資料結構

#include #include #include #include #include void main()

//開始複製了

newfd = dup(fd);

//使用fd寫

write(fd,buffd,strlen(buffd));

close(fd);

//使用newfd寫

write(newfd,bufnewfd,strlen(bufnewfd));

if(close(newfd)==-1)

exit(0);

}

2.dup2函式

標頭檔案:#include

定義函式:int dup2(int oldfd, int newfd);

函式說明:

dup2用來複製引數oldfd所指的檔案描述符,並將oldfd拷貝到引數newfd後一起返回。

若引數newfd為乙個開啟的檔案描述符,則newfd所指的檔案會先被關閉,若newfd等於oldfd,則返回newfd,而不關閉newfd所指的檔案。dup2所複製的檔案描述符與原來的檔案描述符共享各種檔案狀態。共享所有的鎖定,讀寫位置和各項許可權或flags等等.

返回值:如成功則返回新的檔案描述符,否則出錯返回-1. 注意:由dup2函式返回的新檔案描述符一定是當前可用檔案描述符中的最小值。

newfd和oldfd具有的共同點:

(1)相同的開啟檔案(管道)。

(2)相同的檔案指標,即兩個檔案共享乙個檔案指標。

(3)相同的訪問模式。讀取、寫入。

(4)相同的檔案狀態標識。

錯誤**:

ebadf:引數fd非有效的檔案描述符,或該檔案已關閉。

例子2:將標準輸出重定向到目標檔案test.txt

#include #include #include #include #include void main()

refd = dup2(fd,fileno(stdout));

if(refd==-1)

//寫資料,本應該寫入到stdout的資訊重定向而寫入到目標檔案中(test.txt)

printf("dup2的返回值:%d\n",refd);

write(fileno(stdout),buf,strlen(buf));

close(fd);

exit(0);

}

檔案重定向dup2函式

dup和dup2都可用來複製乙個現存的檔案描述符,使兩個檔案描述符指向同乙個file結構體。如果 兩個檔案描述符指向同乙個file結構體,file status flag和讀寫位置只儲存乙份在file結構體中,並且file結構體的引用計數是2。如果兩次open同一檔案得到兩個檔案描述符,則每個描述符...

使用dup和dup2重定向和還原

使用dup 和dup2 重定向和還原 源於開發乙個應用將資料寫的裝置節點中,但是裝置節點具有可變性,所以不在寫死,而是先確定好,開啟fd 再將內容寫進去,最終寫入 fd中的是乙個開源程式,沒有辦法傳遞 fd,不過它會把它要輸出的東西輸出到 stdout 中,開啟這個開源程式之前把 stdout 重定...

使用dup和dup2重定向和還原

使用dup 和dup2 重定向和還原 源於開發乙個應用將資料寫的裝置節點中,但是裝置節點具有可變性,所以不在寫死,而是先確定好,開啟fd 再將內容寫進去,最終寫入 fd中的是乙個開源程式,沒有辦法傳遞 fd,不過它會把它要輸出的東西輸出到 stdout 中,開啟這個開源程式之前把 stdout 重定...