用指標的觀點來深入理解
dup和
dup2
的用法
ejian
2007-09-17
網上有很多資料詳細講解了
dup和
dup2
的用法,有講得不錯的,但總感覺理解起來還是有點困難,通過實踐,我發現一種
c程式更容易理解的講解方法-使用模擬指標的方法來闡述
dup和
dup2
的用法,可能更容易讓人在非常短的時間內接受,下面的內容是我理解
dup和
dup2
用法的總結,希望對
dup和
dup2
存有疑惑的朋友所有幫助。
int* stdin_fileno = (int *)0; //
這是乙個指向標準輸入的指標,由系統預定義,所以可以直接拿來使用
// 下面這句的意思相當於:
int* stdinp = stdin_fileno,
// 即使用stdinp
和stdin_fileno
指向同乙個地方
int* stdinp = dup(stdin_fileno);
// 下面建立管道
int fd[2];
pipe(fd);
// 下面這句相當於:
// stdin_fileno = fd[0];
// 從這裡可以看出
stdin_fileno
和stdinp
指向了不同的位置
dup2(fd[0], stdin_fileno);
// 在這裡可以關閉
fd[0],
因為我們還可以通過
stdin_fileno
// 來操作這塊記憶體,原因是
stdin_fileno
和fd[0]
是指向同乙個地方的
// 所以通常會:
close(fd[0]);
// 以後stdin_fileno
可以替代
fd[0]
了,close(fd[0])
相當於
// fd[0] = null;
// 將fd[0]
指向乙個有效的安全值,關閉它
// 下面再說說如何恢復
:
// 只需要執行:
dup2(stdinp, stdin_fileno);
// 這又使用
stdin_fileno
和stdinp
指向了相同的地方,由於
stdinp
實際上是指向最原始的「
stdin_fileno
」的,
// 所以相當於恢復了指向
// 由於stdin_fileno
和stdinp
現在又都指向了相同的地方,所以
stdinp
已經完成歷史使命,這個時候可以關閉它了:
close(stdinp);
// 這個當然相當於:
stdinp = null;
至此,dup2&dup2
的用法講完了,不知道大家是否可以理解,但我想從指標的角度來理解應該還是相當容易的,且不
會忘記不容易出錯,只要你真正理解了
c語言中的指向是啥東西
(指向乙個記憶體的東東)。
不過,還有一點要請各位注意,
dup和
dup2
的改變指向時會分配記憶體,所以在不使用時要記得開啟,否則
你可能遇到「開啟的檔案過多」的錯誤,比如:
int* stdinp = dup(stdin_fileno);
之後,當
stdinp
完成了它的歷史使命之後,應該呼叫
close(stdinp)
將stdinp
關閉掉,否則會造成開啟的檔案未關閉。
深入理解C C 陣列和指標
c語言中陣列和指標是一種很特別的關係,首先本質上肯定是不同的,本文各個角度論述陣列和指標。一 陣列與指標的關係 陣列和指標是兩種不同的型別,陣列具有確定數量的元素,而指標只是乙個標量值。陣列可以在某些情況下轉換為指標,當陣列名在表示式中使用時,編譯器會把陣列名轉換為乙個指標常量,是陣列中的第乙個元素...
對指標的深入理解
首先對變數這一詞做乙個本質的介紹。變數的實質就是乙個可操作的空間,且變數的變是體現在該儲存空間中所儲存的位址所對應的值是可變的。比如舉乙個例子來說吧 現在不管開啟任意一款遊戲,而這款遊戲中將會難免產生一些臨時的資料,將會在記憶體中臨時儲存,隨著遊戲的不斷進行,則衡量某一標準的資料隨時會發生改變,因此...
深入理解c 指標的指標和指標的引用
展示一下使用指標的指標和指標的引用修改傳遞給方法的指標,以便更好的使用它。這裡說的指標的指標不是乙個二維陣列 為什麼需要使用它們 當我們把乙個指標做為引數傳乙個方法時,其實是把指標的複本傳遞給了方法,也可以說傳遞指標是指標的值傳遞。如果我們在方法內部修改指標會出現問題,在方法裡做修改只是修改的指標的...