個人部落格傳送門
linux 中進行檔案描述符的重定向可以使用兩個函式:dup函式和dup2函式,其中還有乙個dup3函式,但是這個是linux後面版本新增的,不是所有的linux核心都支援,在這裡不討論。
在linux系統中約定檔案描述符 0、1、2 對應標準輸入、標準輸出、標準錯誤,預設開啟。
dup()
#include
int dup(int fd);
使用dup()函式的時候,引數是新的檔案描述符期望指向的檔案描述符。返回檔案描述符表中最小的沒有被使用的檔案描述符。
如果我們的fd除了預設開啟的0、1、2之外,沒有被使用的。我們呼叫dup(1),那麼最小的沒有被使用的fd = 3 就會指向跟fd = 1的同乙個檔案表。
他的做法就類似以下做法:
fcntl(1, f_dupfd, 0); //fcntl函式用來改變已經開啟檔案的屬性。
dup2()#include
int dup2(int fd, int fd2);
引數中fd指的是希望被改變的檔案描述符,fd2是期望指向的舊的檔案描述符。如果fd已經被使用,那麼就關閉它。如果fd = fd2,返回fd2但是不關閉。
dup2()函式的做法跟dup一樣,不同點是dup2()函式可以指定期望改變的fd,而不是去最小未被使用的fd。如果要我們的fd = 3也指向fd = 1的話。呼叫如下:
dup2
(3, 1);
他的做法類似以下做法:
close(3);
fcntl(3, f_dupfd, 1);
但是跟上面兩個函式呼叫有點不同的是,dup2()函式的操作是原子性的。分兩個函式呼叫的中間可能會出現其他函式的呼叫。 12 dup函式和dup2函式
當呼叫dup函式時,核心在程序中建立乙個新的檔案描述符,該檔案描述符是當前可用檔案描述符的最小數值,這個檔案描述符指向oldfd所擁有的檔案表項。函式原型 include int dup int oldfd 引數說明 oldfd為已經開啟的檔案描述符 返回值 成功返回乙個新檔案描述符,失敗返回 1並...
Linux 系統呼叫 dup 和dup2
1 dup dup 系統呼叫會建立檔案描述符的乙個拷貝 1 新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 1 2對應標準輸入 標準輸出 標準錯誤輸出 2 如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用 3 兩者都指向同乙個開啟的檔案描述符,因此共享檔案偏移量和檔案狀態標誌 語法 ...
重定向程式設計 dup和dup2函式
輸入重定向 關閉標準輸入裝置,開啟 或複製 某普通檔案,使其檔案描述符為0.輸出重定向 關閉標準輸出裝置,開啟 或複製 某普通檔案,使其檔案描述符為1.錯誤輸出重定向 關閉標準錯誤輸入裝置,開啟 或複製 某普通檔案,使其檔案描述符為2.1.dup函式 返回值 如成功則返回新的檔案描述符,否則出錯返回...