1. 程式人生 > >linux之dup和dup2函式解析

linux之dup和dup2函式解析

系統呼叫dup和dup2能夠複製檔案描述符。dup返回新的檔案檔案描述符(沒有用的檔案描述符最小的編號)。dup2可以讓使用者指定返回的檔案描述符的值,如果需要,則首先接近newfd的值,他通常用來重新開啟或者重定向一個檔案描述符。

在linux下,通過open開啟以檔案後,會返回一個檔案描述符,檔案描述符會指向一個檔案表,檔案表中的節點指標會指向節點表。看下圖:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

dup和dup2兩個函式都可以用來複制開啟的檔案描述符,複製成功後和複製源共享同一個檔案表。看下圖:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

dup函式

0?wx_fmt=png

dup返回的新檔案描述符一定是當前可以用描述符中的最小值。下面先開啟一個檔案來看下檔案描述符,為保證測試成功,建立一個測試檔案log.txt。

0?wx_fmt=png

上面的程式碼用讀寫打開了log.txt這個檔案,編譯上面的程式碼然後執行,執行成功的話,應當是輸出3,因為0,1,2分別被標準輸入,標準輸出,標準錯誤輸出佔用了。使用dup複製這個檔案描述符,並嘗試移動fd偏移量:

0?wx_fmt=png

編譯執行上例程式碼可以發現當移動fd的偏移量時,copyfd的偏移量也發生了變化。往檔案裡寫入內容試試,先把log.txt內容清空。

0?wx_fmt=png

編譯執行程式,log.txt的就有hello world!字串了。

dup2函式

0?wx_fmt=png

dup2和dup函式一樣,只是返回的檔案描述符可以通過第二個引數”可用的檔案描述符“指定。如果“可用的檔案描述符“是開啟狀態,則會被關閉;如果”現存的檔案描述符“和”可用的檔案描述符“一樣,則不會關閉,筆者認為這兩個引數值一樣的話,程式碼是沒有任何意義的。

0?wx_fmt=png

上面程式就是指定返回的檔案描述為1000,再來看下指定的檔案描述符是開啟的情況,修改上例程式碼,將檔案描述符指定為1:

0?wx_fmt=png

編譯執行程式將看不到任何輸出,因為1是終端標準輸出的識別符號,經過這樣一複製後,標準輸出就被關閉了,使用printf自然看不到輸出資訊了。

相關推薦

linuxdupdup2函式解析

系統呼叫dup和dup2能夠複製檔案描述符。dup返回新的檔案檔案描述符(沒有用的檔案描述符最小的編號)。dup2可以讓使用者指定返回的檔案描述符的值,如果需要,則首先接近newfd的值,他通常用來重新開啟或者重定向一個檔案描述符。 在linux下,通過open開啟以檔案後

dupdup2函式的小理解

int dup(int fd); int dup2(int fd, int fd 2); dup的引數是一個檔案描述符,指向一個檔案(stdin,stdout等也是特殊的檔案)。返回的也是一個檔案描述符(當前還未被使用的最小的描述符編號),這個描述符和fd指向同一個檔案。也就

dupdup2函式簡單使用

dup函式 標頭檔案和函式原型: #include <unistd.h> int dup(int oldfd); dup函式是用來開啟一個新的檔案描述符,指向和oldfd同一個檔案,共享檔案偏移量和檔案狀態。 共享偏移量程式碼: int main(int argc, char const

淺析dup()dup2()函式

前言   在linux下,一切皆檔案。當檔案被開啟時,會返回檔案描述符用於操作該檔案,從shell中執行一個程序,預設會有3個檔案描述符存在(0、1、2);)0表示標準輸入,1表示標準輸出,2表示標準錯誤。一個程序當前有哪些開啟的檔案描述符可以通過/proc/

《pandas入門》read_excel()to_excel()函式解析

前言 資料分析時候,需要將資料進行載入和儲存,本文主要介紹和excel的互動。 read_excel() 載入函式為read_excel(),其具體引數如下。 read_excel(io, sheetname=0, header=0, skipr

[linux]--使用dupdup2重定向還原

       源於開發一個應用將資料寫的裝置節點中,但是裝置節點具有可變性,所以不在寫死,而是先確定好,開啟fd再將內容寫進去,最終寫入fd中的是一個開源程式,沒有辦法傳遞fd,不過它會把它要輸出的東西輸出到stdout中,開啟這個開源程式之前把stdout重定向到fd上就可以完成了對接。鋪墊完了,下面就

【轉】Linux系統編程---dupdup2詳解

系統 強調 操作 attach bsp ads 正常的 註意 tdi 正常的文件描述符: 在linux下,通過open打開以文件後,會返回一個文件描述符,文件描述符會指向一個文件表,文件表中的節點指針會指向節點表。看下圖: 打開文件的內核數據結構 dup和dup2兩

函式dupdup2

函式原型: #include<unistd.h> int dup(int oldfd); 返回值:若成功,返回新的檔案描述符;若出錯,返回-1

利用dupdup2linux中實現簡單的重定向輸出

Linux中檔案描述符 0代表標準輸入檔案stdin、1代表標準輸出檔案stdout、2代表標準錯誤輸出檔案stderr,STDOUT_FILENO是一個巨集 為1 #include<stdio.h> #include<unistd.h> #include<s

Linux 系統呼叫 dup()dup2()

1、dup() dup()系統呼叫會建立檔案描述符的一個拷貝: (1)新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 、1 、2對應標準輸入、標準輸出、標準錯誤輸出 (2)如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用 (3)兩者都指向同一個開啟的檔案描述符,因此共

dupdup2理解

檔案描述符:                                                                                                                                   

dupdup2檔案描述符相關函式

#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h>

linuxdupdup2重定向檔案描述符

【dup】 利用函式dup,我們可以複製一個描述符。傳給該函式一個既有的描述符,它就會返回一 個新的現有的最小的未被使用的描述符,這個新的描述符是傳給它的描述符的拷貝。這意味著,這兩個描述符共享同一

每天學點linux-mkdircd

linux目錄處理命令(上)創建目錄命令mkdir -p 【目錄名】-p用來遞歸創建mkdir -p outerdir/innerdir desktop Jeff$ ls$RECYCLE.BIN Learning_Python Thumbs.db outerdir 實習小結.md A*算法 SSH設置 m

linuxnloadiftop查看網絡使用情況

eth ron 有一點 hide spa 有變 config RR download 操作系統: centos7 nload: yum install -y gcc yum install -y gcc-c++ yum install -y ncurses-devel

使用dupdup2重定向還原

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言readwrite函式解析

在研究一份AES加密程式碼的時候,發現程式碼從command line獲取資料僅僅使用了read函式,很是疑問。從command line獲取資料不是要使用scanf函式嗎?所以,詳細瞭解了C庫的read函式特性。順帶了write函式,他們是couple一對兒!!! 主要參考文章:h

C語言getchar()putchar()函式

一、getchar()函式 getchar()函式不帶任何引數,他從佇列中返回下一個字元。 ch = getchar()//讀取下一個字元的輸入,並把該字元的值付給變數ch 該語句與下面的語句效果相同: scanf("%c", &ch); 二、putchar(

linux變數引數

1.定義變數 a=1 2.使用變數 ${a} 或者$a,{}:幫助直譯器識別變數邊界 3.只讀變數 readyonly a 使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。 /bin/sh: a: This variable i

高階I/Oreadvwritev函式

為什麼引出readv()和writev() 因為使用read()將資料讀到不連續的記憶體、使用write()將不連續的記憶體傳送出去,要經過多次的呼叫read、write 如果要從檔案中讀一片連續的資料至程序的不同區域,有兩種方案:①使用read()一次將它們讀至一個較大的緩