功能:複製檔案描述符,重定向輸入輸出。
函式:
#include
intdup
(int oldfd)
;int
dup2
(int oldfd,
int newfd)
;返回值:
成功:dup函式返回當前系統可用的最小整數值。
dup2函式返回第乙個不小於newfd的整數值,分兩種情況:
1. 如果newfd已經開啟,則先將其關閉,再複製檔案描述符;
2. 如果newfd等於oldfd,,則dup2函式返回newfd,而不關閉它。
失敗:dup和dup2函式均返回-
1,並設定errono。
複製檔案描述符後,新舊檔案描述符的特點:
使用dup或dup2複製檔案描述符後,新檔案描述符和舊檔案描述符指向同乙個檔案,共享檔案的鎖定、讀寫位置和各項許可權。
當關閉新的檔案描述符時,通過舊檔案描述符仍可操作檔案。
當關閉舊的檔案描述符時,通過新的檔案描述符仍可操作檔案。
注意:是共享檔案偏移量和檔案狀態標誌。
比如:其中乙個使用lseek修改檔案偏移量,另乙個也會改變(讀寫等操作位置會改變)。
/* 例子:複製檔案描述符,並向檔案寫資料 */
#include
#include
#include
#include
#include
void
main()
/* 開始複製 */
newfd =
dup(oldfd)
;printf
("newfd = %d\n"
, newfd)
;/* 使用oldfd寫 */
write
(oldfd, oldstr,
strlen
(oldstr));
if(close
(oldfd)==-
1)/* 使用newfd寫 */
write
(newfd, newstr,
strlen
(newstr));
if(close
(newfd)==-
1)exit(0
);}
執行結果:
終端輸出:
oldfd = 3
newfd = 4
檢視test.txt:
write by oldfd.
write by newfd.
注意:新舊檔案描述符是共享檔案讀寫位置。 Linux C dup和dup2函式詳解
系統呼叫dup 建立檔案描述符oldfd的乙個副本,使用編號最低的未使用描述符作為新描述符。成功返回後,新舊檔案描述符可以互換使用。它們引用相同的開啟檔案描述,因此共享檔案偏移量和檔案狀態標誌 例如,如果在其中乙個描述符上使用lseek 2 修改檔案偏移量,則另乙個描述符的偏移量也會更改。這兩個描述...
dup函式剖析
dup的作用是複製檔案控制代碼。為了能夠一睹dup的真身,不得不提到任務資料結構 就是我們常說的pcb結構。在linux核心中,此結構定義為struct task struct。task struct有乙個檔案結構指標陣列,陣列的元素個數就是程序能夠開啟的檔案控制代碼的數量最大值。當前程序開啟的每個...
12 dup函式和dup2函式
當呼叫dup函式時,核心在程序中建立乙個新的檔案描述符,該檔案描述符是當前可用檔案描述符的最小數值,這個檔案描述符指向oldfd所擁有的檔案表項。函式原型 include int dup int oldfd 引數說明 oldfd為已經開啟的檔案描述符 返回值 成功返回乙個新檔案描述符,失敗返回 1並...