dup2重定向後的恢復

2021-08-04 14:52:28 字數 1325 閱讀 2299

這週是留校的第二週,寫shell分析引數著實難受,更難受的還在後面,由於自己shell的結構比較奇特,在fork之前已經進行了重定向,導致在excv執行程式之後結果無法列印到螢幕上。好生苦惱,好在萬能的google解決了這個問題,因此為大家分享一下。

咱們先來看個**吧

#include

#include

#include

#include

#include

#include

int main()

; char* argv2[10]=;

int fd = open("file",o_rdwr|o_creat|o_trunc,0644);

//sfd=dup(1);

dup2(fd,1);

if((pid=fork())==0)

if(waitpid(pid,&statues,0)==-1)

fd=open("file",o_rdonly);

dup2(fd,0);

//dup2(sfd,1);

dup2(1,fd); //錯誤做法

execvp(argv2[0],argv2);

}

這個例子就是在shell環境下輸入

ls > file | wc
按照上面的**,1已經變為了fd的拷貝,然後再將fd重定向到1相當於重定向fd自己。因此並不能起到恢復重定向的效果,因此wc所得結果會被重定向到檔案file中,因此shell並不顯示結果。

那麼我們該怎麼做才行?只需要將上面的注釋去掉,然後再刪除標錯的**就行了。

下來我們介紹一下dup系列。

#include 

int dup(int oldfd);

int dup2(int oldfd, int newfd);

利用函式dup,我們可以複製乙個描述符。傳給該函式乙個既有的描述符,它就會返回一

個新的描述符,這個新的描述符是傳給它的描述符的拷貝。這意味著,這兩個描述符共享同一

個資料結構。

dup2函式跟dup函式相似,但dup2函式允許呼叫者規定乙個有效描述符和目標描述符的id

。dup2函式成功返回時,目標描述符(dup2函式的第二個引數)將變成源描述符(dup2函式的

第乙個引數)的複製品,換句話說,兩個檔案描述符現在都指向同乙個檔案,並且是函式第一

個引數指向的檔案。

根據上面所訴,我們在使用dup2重定向標準輸出後又需要恢復標準輸出,只需在使用dup2重定向前,使用dup備份一下標準輸出,待到需要恢復時將標準輸出重定向回備份即可

使用dup和dup2重定向和還原

使用dup 和dup2 重定向和還原 源於開發乙個應用將資料寫的裝置節點中,但是裝置節點具有可變性,所以不在寫死,而是先確定好,開啟fd 再將內容寫進去,最終寫入 fd中的是乙個開源程式,沒有辦法傳遞 fd,不過它會把它要輸出的東西輸出到 stdout 中,開啟這個開源程式之前把 stdout 重定...

使用dup和dup2重定向和還原

使用dup 和dup2 重定向和還原 源於開發乙個應用將資料寫的裝置節點中,但是裝置節點具有可變性,所以不在寫死,而是先確定好,開啟fd 再將內容寫進去,最終寫入 fd中的是乙個開源程式,沒有辦法傳遞 fd,不過它會把它要輸出的東西輸出到 stdout 中,開啟這個開源程式之前把 stdout 重定...

檔案重定向dup2函式

dup和dup2都可用來複製乙個現存的檔案描述符,使兩個檔案描述符指向同乙個file結構體。如果 兩個檔案描述符指向同乙個file結構體,file status flag和讀寫位置只儲存乙份在file結構體中,並且file結構體的引用計數是2。如果兩次open同一檔案得到兩個檔案描述符,則每個描述符...