檔案描述符存在形式及其dup2函式的使用

2021-08-04 14:50:23 字數 912 閱讀 8316

最近寫myshell的時候,用到了dup2這個函式,函式的形式看著很簡單,但是當時就是很不理這麼用的意義在**,不知道它具體是怎麼實現重定向輸入輸出的。後來上網查了很多資料,從檔案描述符開始來了解,想了想。

對於核心來說,都是通過檔案描述符去開啟檔案的,而標準輸入輸出都是檔案。標準輸出檔案(stdout)和標準錯誤輸出檔案(stderr),這兩個檔案都對應終端的螢幕。程序將從標準輸入檔案中得到輸入資料,將正常輸出資料輸出到標準輸出檔案,而將錯誤資訊送到標準錯誤檔案中。核心是不知道檔案流的存在的,所以printf函式輸出到stdout的東西最後都寫入了檔案描述符1中,在檔案表中存在檔案狀態標誌、當前檔案偏移量、v節點指標,每個開啟的檔案描述符(fd標誌)在程序表中都有自己的檔案

表項,由檔案指標指向它

當我了解到這裡的時候,其實dup2( )這個函式也就很好理解它是怎麼操作的了。

假如oldfd的值為1, 當前檔案描述符的最小值為3, 那麼新描述符3指向檔案描述符1所擁有的檔案表項。其實原來cgi程式使用dup2函式將stdout_finleno(巨集為1)這個檔案描述符重定向到了連線套接字。

在沒有使用dup2的時候:

printf 將資料給 stdout 然後再交給 stdout_fileno(巨集為1的檔案描述符) 最後才交給 終端

使用dup2的時候:

printf 將資料給 stdout 然後再交給 stdout_fileno(巨集為1的檔案描述符) 最後才交給重定向的confid(個標識已連線套介面的描述字)感覺其中還涉及了管道,畢竟最後的輸出已經指向了另外的檔案描述符了。

複製檔案描述符dup和dup2

檔案描述符的複製 dup和dup2是兩個非常有用的系統呼叫,都是用來複製乙個檔案的描述符,使新的檔案描述符也標識舊的檔案描述符所標識的檔案。int dup int oldfd int dup2 int oldfd,int newfd dup和dup2經常用來重定向程序的stdin,stdout和st...

3 12 dup函式 檔案描述符複製

dup函式用於從乙個已存在的檔案描述符複製乙個新檔案描述符。函式原型如下 include int dup int filedes 返回值 若賦值成功則返回新檔案描述符,若出錯則返回 1 引數 filedes被複製檔案描述符。例項 x.3.12.1.c include include include ...

關於dup改變檔案描述符(輸出重定向)

函式dup,接收乙個舊的檔案描述符,返回乙個新的檔案描述符 最小的未被分配的檔案描述符 什麼是檔案描述符?當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。檔案描述符是非負整數。案例 將本來輸出到...