dup函式剖析

2021-05-23 07:57:10 字數 847 閱讀 9324

dup的作用是複製檔案控制代碼。為了能夠一睹dup的真身,不得不提到任務資料結構-----就是我們常說的pcb結構。在linux核心中,此結構定義為struct task_struct。

task_struct有乙個檔案結構指標陣列,陣列的元素個數就是程序能夠開啟的檔案控制代碼的數量最大值。當前程序開啟的每個檔案都在此陣列中佔據乙個位置。

函式原型:int dup(int oldfd)。oldfd是原控制代碼,如果複製成功,則返回oldfd控制代碼的乙個副本,此副本與原控制代碼指向記憶體中同乙個檔案節點。

此後通過控制代碼對檔案的操作也會影響到另乙個控制代碼的操作行為。比如通過lseek對副本檔案控制代碼所指檔案定位時,原控制代碼的檔案當前指標也會跟著變化。

核心中的任務資料結構有乙個長整數型別的變數close_on_exec。通過fork建立子程序後,子程序呼叫exec類函式執行新程式時,會根據close_on_exec的每個位元位所代表的檔案描述符,關閉相應的檔案,但是通過dup複製的檔案控制代碼不在此列。原始碼面前,了無秘密,摘自linux0.11版核心的原始碼如下:

static int dupfd(unsigned int fd, unsigned int arg)

current->close_on_exec &= ~(1<(current->filp[arg] = current->filp[fd])->f_count++; //原控制代碼與副本控制代碼所指的檔案節點的計數器加1

int do_execve(...)

for (i=0 ; iclose_on_exec>>i)&1)

sys_close(i);

current->close_on_exec = 0;

dupfd是dup的具體實現。do_execve是exec家族函式的具體實現

dup函式詳解

功能 複製檔案描述符,重定向輸入輸出。函式 include intdup int oldfd int dup2 int oldfd,int newfd 返回值 成功 dup函式返回當前系統可用的最小整數值。dup2函式返回第乙個不小於newfd的整數值,分兩種情況 1.如果newfd已經開啟,則先將...

12 dup函式和dup2函式

當呼叫dup函式時,核心在程序中建立乙個新的檔案描述符,該檔案描述符是當前可用檔案描述符的最小數值,這個檔案描述符指向oldfd所擁有的檔案表項。函式原型 include int dup int oldfd 引數說明 oldfd為已經開啟的檔案描述符 返回值 成功返回乙個新檔案描述符,失敗返回 1並...

Linux中dup函式和dup2函式

個人部落格傳送門 linux 中進行檔案描述符的重定向可以使用兩個函式 dup函式和dup2函式,其中還有乙個dup3函式,但是這個是linux後面版本新增的,不是所有的linux核心都支援,在這裡不討論。在linux系統中約定檔案描述符 0 1 2 對應標準輸入 標準輸出 標準錯誤,預設開啟。du...