輸入重定向:關閉標準輸入裝置,開啟(或複製)某普通檔案,使其檔案描述符為0.
輸出重定向:關閉標準輸出裝置,開啟(或複製)某普通檔案,使其檔案描述符為1.
錯誤輸出重定向:關閉標準錯誤輸入裝置,開啟(或複製)某普通檔案,使其檔案描述符為2.
1.dup函式
返回值:如成功則返回新的檔案描述符,否則出錯返回-1.注意:由dup函式返回的新檔案描述符一定是當前可用檔案描述符中的最小值。
ebadf:引數fd非有效的檔案描述符,或該檔案已關閉。
假設程序執行了:newfd = dup(1);
當此函式執行時,假定下乙個可用的檔案描述符是3.因為兩個描述符指向同乙個檔案表項,所以他們共享同一檔案狀態標誌以及同一當前檔案偏移量。如圖1所示。
圖1 複製檔案描述符的核心資料結構
2.dup2函式#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);
}
標頭檔案:#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 重定...