Linux的管道機制和重定向

2021-08-20 02:48:55 字數 2254 閱讀 3226

1.管道機制

在linux中,管道是一種使用非常頻繁的通訊機制。從本質上說,管道也是一種檔案,但它又和一般的檔案有所不同,管道可以克服

使用檔案進行通訊的兩個問題,具體表現為:

·      限制管道的大小。實際上,管道是乙個固定大小的緩衝區。在linux中,該緩衝區的大小為1頁,即4k位元組,使得它的大小不象文

件那樣不加檢驗地增長。使用單個固定緩衝區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨後對管道的write()調

用將預設地被阻塞,等待某些資料被讀取,以便騰出足夠的空間供write()呼叫寫。

·      讀取程序也可能工作得比寫程序快。當所有當前程序資料已被讀取時,管道變空。當這種情況發生時,乙個隨後的read()呼叫將

預設地被阻塞,等待某些資料被寫入,這解決了read()呼叫返回檔案結束的問題。

注意:從管道讀資料是一次性操作,資料一旦被讀,它就從管道中被拋棄,釋放空間以便寫更多的資料。

1. 1.管道的結構

在 linux 中,管道的實現並沒有使用專門的資料結構,而是借助了檔案系統的file結構和vfs的索引節點inode。通過將兩個 file 結

構指向同乙個臨時的vfs 索引節點,而這個 vfs 索引節點又指向乙個物理頁面而實現的。如圖 7.1所示。

圖7.1  管道結構示意圖

圖7.1中有兩個 file 資料結構,但它們定義檔案操作例程位址是不同的,其中乙個是向管道中寫入資料的例程位址,而另乙個是從管

道中讀出資料的例程位址。這樣,使用者程式的系統呼叫仍然是通常的檔案操作,而核心卻利用這種

抽象機制

實現了管道這一特殊操

作。1.2.管道的讀寫

管道實現的源**在fs/pipe.c中,在pipe.c中有很多函式,其中有兩個函式比較重要,即管道讀函式pipe_read()和管道寫函式

pipe_wrtie()。管道寫函式通過將位元組複製到 vfs 索引節點指向的物理記憶體而寫入資料,而管道讀函式則通過複製物理記憶體中的位元組

而讀出資料。當然,核心必須利用一定的機制同步對管道的訪問,為此,核心使用了鎖、等待佇列和訊號。

當寫程序向管道中寫入時,它利用標準的庫函式write(),系統根據庫函式傳遞的檔案描述符,可找到該檔案的 file 結構。file 結構

中指定了用來進行寫操作的函式(即寫入函式)位址,於是,核心呼叫該函式完成寫操作。寫入函式在向記憶體中寫入資料之前,必

須首先檢查 vfs 索引節點中的資訊,同時滿足如下條件時,才能進行實際的記憶體複製工作:

記憶體中有足夠的空間可容納所有要寫入的資料;

記憶體沒有被讀程式鎖定。

如果同時滿足上述條件,寫入函式首先鎖定記憶體,然後從寫程序的位址空間中複製資料到記憶體。否則,寫入程序就休眠在 vfs 索引

節點的等待佇列中,接下來,核心將呼叫排程程式,而排程程式會選擇其他程序執行。寫入程序實際處於可中斷的等待狀態,當內

存中有足夠的空間可以容納寫入資料,或記憶體被解鎖時,讀取程序會喚醒寫入程序,這時,寫入程序將接收到訊號。當資料寫入內

存之後,記憶體被解鎖,而所有休眠在索引節點的讀取程序會被喚醒。

管道的讀取過程和寫入過程類似。但是,程序可以在沒有資料或記憶體被鎖定時立即返回錯誤資訊,而不是阻塞該程序,這依賴

檔案或管道的開啟模式。反之,程序可以休眠在索引節點的等待佇列中等待寫入程序寫入資料。當所有的程序完成了管道操作之

後,管道的索引節點被丟棄,而共享資料頁也被釋放。

因為管道的實現涉及很多檔案的操作,因此,當讀者學完有關檔案系統的內容後來讀pipe.c中的**,你會覺得並不難理解。

1.3.管道的使用

例如檢視python的程序,ps是檢視程序命令,-e是檢視所有程序,f是全格式顯示,|是管道符號,grep是模糊過濾

將ps -ef的輸出流通過管道作為輸入流輸入grep python命令中,有grep輸入結果

ps –ef |grep python

2.重定向

>filename,重定向標準輸出到檔案,覆蓋檔案。

>>filename,重定向標準輸出到檔案,追加模式。

2>filename,重定向標準錯誤到檔案。

&>filename,重定向標準輸入和標準錯誤到檔案。相當於同時使用》和2>。

find/ -name "filename" 2> /dev/null

再比如在用gdb進行自動測試的時候,把命令寫到乙個檔案裡,然後送入gdb。

gdbprogram < test_script.gdb

linux重定向 管道

1 這條命令是什麼意思?cat file1 file2 grep name tee file3 file4 file5 wc l 該命令表示 將 file1 file2 中的包含 name 的行重定向輸出。使用 tee 命令表示 將該輸出有兩個去向。乙個是定向到檔案 file3,file4,flie...

重定向和管道

重定向和管道 第 3 章 命令列簡介 程序 包括圖形應用程式,但不包括絕大多數守護程式 至少使用三個檔案描述符 標準輸入 標準輸出和標準錯誤輸出 它們相應的序號是 0 1 和 2。一般來說,這三個描述符與該程序啟動的終端相關聯,其中輸入為鍵盤。重定向和管道的目的是重定向這些描述符。本節中的例項將幫助...

管道和重定向

重定向輸出 ls l 1.txt 這條命令,把本應該在標準輸出 檔案描述符為1 裝置上顯示的內容重定向到了 1.txt 檔案中,而在標準輸出中不會有任務顯示 如果當前目錄下,1.txt檔案存在,則新內容會覆蓋1.txt裡的所有內容.不存在則會在當前目錄中新建乙個1.txt ls l 2.txt 這條...