Linux下管道使用的一些限制

2021-06-18 20:50:27 字數 1441 閱讀 1217

在書上和網上翻了翻,管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。linux管道分為無名管道和命名管道。

一、無名管道pipe

無名管道具有以下特點:

1、只能用於具有血緣關係的程序之間,可用於程序或者執行緒間的通訊;

2、半雙工的通訊模式,具有固定的讀端和寫端;

3、一種特殊的檔案,存在於記憶體中。可通過read、write對其操作。

pipe使用過程中主要需的限制也是基於以上特點:

1、兩個程序通過乙個無名管道只能實現單向通訊(半雙工),父程序寫子程序讀,如果有時候也需要子程序寫父程序讀,就必須另開乙個管道。如果只開乙個管道,但是父程序不關閉讀端,子程序也不關閉寫端,雙方都有讀端和寫端,是不能實現雙向通訊的。

2、管道的讀寫端通過開啟的檔案描述符來傳遞,因此要通訊的兩個程序必須從它們的公共祖先那裡繼承管道檔案描述符。上面的例子是父程序把檔案描述符傳給子程序之後父子程序之間通訊,也可以父程序fork兩次,把檔案描述符傳給兩個子程序,然後兩個子程序之間通訊,總之需要通過fork傳遞檔案描述符使兩個程序都能訪問同一管道,它們才能通訊。

使用管道需要注意以下4種特殊情況(假設都是阻塞i/o操作,即沒有設定o_nonblock標誌):

1、如果所有指向管道寫端的檔案描述符都關閉了(管道寫端的引用計數等於0),而仍然有程序從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會返回0,就像讀到檔案末尾一樣。

2、如果有指向管道寫端的檔案描述符沒關閉(管道寫端的引用計數大於0),而持有管道寫端的程序也沒有向管道中寫資料,這時有程序從管道讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會阻塞,直到管道中有資料可讀了才讀取資料並返回。

3、如果所有指向管道讀端的檔案描述符都關閉了(管道讀端的引用計數等於0),這時有程序向管道的寫端write,那麼該程序會收到訊號sigpipe,通常會導致程序異常終止。

4、如果有指向管道讀端的檔案描述符沒關閉(管道讀端的引用計數大於0),而持有管道讀端的程序也沒有從管道中讀資料,這時有程序向管道寫端寫資料,那麼在管道被寫滿時再次write會阻塞,直到管道中有空位置了才寫入資料並返回。

二、命名管道fifo

匿名管道(無名管道pipe)應用的乙個限制就是只能在具有共同祖先(具有親緣關係)的程序間通訊。如果我們想在不相關的程序之間交換資料,可以使用fifo檔案來做這項工作,它經常被稱為命名管道fifo。

一旦建立了乙個fifo,就可以用open開啟它,一般的檔案訪問函式(close,read,write)都可以用於fifo。

當開啟fifo時,是否設定非阻塞標誌(o_nonblock),將對以後的讀寫產生如下影響:

1、沒有設定o_nonblock:訪問要求無法滿足時程序阻塞。如讀取空的fifo時,或者寫入fifo已滿時;

2、設定了o_nonblock:訪問要求無法滿足時不阻塞,立即出錯返回,error是enxio。

Linux下管道的實現機制

檢視linux下管道的預設大小可以使用命令ulimit a 儘管命令ulimit a看到管道大小8塊,緩衝區的大小不是4 k,因為核心動態分配最大16 緩衝條目 乘64 k 驗證管道的容量 管道是一種最基本的 ipc機制,由pipe函式建立 呼叫pipe函式時在核心中開闢 一塊緩衝區 稱為管道 用於...

linux下 管道 和xargs的區別

linux 任何乙個命令都是呼叫了乙個可執行的程式,比如說 ls l,ls是乙個可執行檔名,l 是乙個該程式執行時候的乙個引數 管道和xargs的作用,舉個c程式來說如下 void main int argc,char argv xargs的作用就是提供程式執行時的引數,就是將xargs傳遞到上述 ...

Mysql的一些限制

最近工作中需要用到mysql,碰到一些問題,ps 我用的5.1 1 mysql建立view的時候不支援裡面有巢狀查詢。會報這個錯誤 mysql 1349 view s select contains a subquery in the from clause 錯誤,所以建立查詢的時候請盡量避免 se...