回覆列表
  • 1 # 使用者2458114238191884

    在Linux中,管道是一種使用非常頻繁的通訊機制。從本質上說,管道也是一種檔案,但它又和一般的檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題,具體表現為:

    · 限制管道的大小。實際上,管道是一個固定大小的緩衝區。在Linux中,該緩衝區的大小為1頁,即4K位元組,使得它的大小不像檔案那樣不加檢驗地增長。使用單個固定緩衝區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨後對管道的write()呼叫將預設地被阻塞,等待某些資料被讀取,以便騰出足夠的空間供write()呼叫寫。

    · 讀取程序也可能工作得比寫程序快。當所有當前程序資料已被讀取時,管道變空。當這種情況發生時,一個隨後的read()呼叫將預設地被阻塞,等待某些資料被寫入,這解決了read()呼叫返回檔案結束的問題。

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

    我們可以使用管道符|來連線程序.在Linux系統中,由管道連線起來的程序可以自動執行,就如同在他們有一個數據流一樣.在下面的這個例子中,我們要使用sort命令來排序ps的輸出.而如果我們不使用管道,我們就要分幾步來完成:

    $ ps > psout.txt

    $ sort psout.txt >pssort.out

    一個更好的辦法就是可以用管道來處理:

    $ ps | sort > pssort.out

    因為我們要在螢幕上看到他們,我們要使用第三個程序:

    $ ps | sort | more

    使用的管道數並沒有一個量的限制.如果我們要看到正在執行的除了shell以外的不同名字的程序,我們可以用下面的命令:

    $ ps -xo comm | sort | uniq | grep -v sh | more

    在這個命令中,使用了ps的輸出,將這個輸出以字母的順序進行排序,使用uniq來解壓程序,使用grep -v sh來移除名為sh的程序,最後在螢幕上顯示結果.

    在這裡我們就可以看到,這樣的方式式要比單個執行的命令好得多.在這裡我們要注意的一點點就是,在這個命令中我們不要兩次使用同一個檔案.如下面的命令:

    $ cat mydate.txt | sort | uniq | >mydate.txt

    這樣我們就會得到一個空檔案,因為在我們讀取這個之前已經改寫了這個檔案. Linux C 中的管道函式pipe

    #include

    函式原型: int pipe(int fd[2])

    返回值: 成功為 0 , 出錯為 -1

    管道只能用於有親緣關係程序間的通訊。要實現獨立程序間的通訊可參照有名管道(FIFO)。 用unix所謂的管道 可以把一個程序的標準輸出流與另一個程序的標準輸入流連線起來

    unix中許多命令被設計為過濾器 從標準輸入中讀取輸入 將輸出傳送到 標準輸出

    bash用“|” 在兩個命令之間建立管道 管道只能半雙工通訊,即某一時刻只能單向傳輸。要實現父子程序雙方互動通訊,需要定義兩個管道。

    下面只提供單一管道父程序向子程序傳送“Hello!”。 /*使用pipe實現父程序向子程序傳送資訊*/#include

  • 中秋節和大豐收的關聯?
  • 有首英文歌叫〈天使〉.哪位女歌手唱的最好聽呀?