管道是unix系統ipc的最古老的形式,並且所有的unix系統都提供這種通訊機制,當然也包括linux。這樣利用管道進行ipc管道具有如下限制:
1、歷史原因造成管道是半雙工的,資料只能單向流動。如果想雙向通訊,必須要建立兩個管道。2 管道的建立2、管道通訊雙方必須有親緣關係的程序之間(父子程序或者兄弟程序之間)。
經由pipefd引數返回兩個檔案描述符,pipefd[0]描述符用來讀取管道中的資料,可以簡稱為管道的讀端;pipefd[1]檔案描述符用來向管道寫入資料,簡稱為管道的寫端。
返回的pipefd描述符都位於同乙個程序中,沒有任何意義。通常呼叫pipe的程序緊接著呼叫fork,這樣就可以建立從父程序到子程序的管道(父程序關閉pipefd[0],子程序關閉pipefd[1])或者從子程序到父程序的通訊(父程序關閉pipefd[1],子程序關閉pipefd[0]),用管道進行程序間通訊了。
3 管道的讀寫
管道的讀寫是通過系統呼叫read和write完成的。pipefd[0]和pipefd[1]分別對應管道的讀端和寫端,pipefd[0]描述符用來讀取管道中的資料,pipefd[1]檔案描述符用來向管道寫入資料。如果向pipefd[0]寫資料,或者向pipefd[1]讀資料都將會得到錯誤。
當管道一端關閉之後,遵循如下規則:
1、當所有的寫端都關閉時,當管道中所有的資料都被讀取後,read將會返回0,以指示達到了檔案末尾。理論上如果還有程序沒有關閉管道的寫端的話,讀端將不會到達檔案末尾。系統常量pipe_buf定義了管道的大小。該系統常量定義在limits.h中,執行期可以通過pathconf或者fpathconf系統呼叫查詢pipe_buf的值。linux中pipe_buf的值為4096,假如你在編寫可移植的程式,請用pipe_buf這個巨集,而不要用4096這個數值(不同unix系統上面pipe_buf值的大小是不一樣的)。2、如果管道的讀端已經關閉,再向管道寫資料的話,將會產生sigpipe訊號。預設sigpipe訊號處理是結束當前程序,如果當前程序忽略sigpipe訊號,則write函式返回-1,errno置為epipe。
對管道寫入資料小於等於pipe_buf時,系統保證這個寫入操作是原子操作,write將會一次性寫入管道,並返回,當系統多個程序寫管道時,將保證不會穿插寫入。如果寫入資料量大於pipe_buf,則系統將不再保證寫入操作為原子操作,當管道有空間,write就將會寫入一部分資料,當所有的資料都寫入管道之後,write返回,當有多個程序同時寫管道時,將會出現穿插寫入的情況。
4 管道應用例項
通過例子我們可以看到,管道資料流向是從子程序到父程序的。父程序關閉了管道的寫端,保留管道的讀端,而子程序則關閉了管道的讀端,而保留管道的寫端。
5 管道的總結
通過上面的描述,我們可以總結一下他的特點:
1、資料單向流動。2、沒有管道命名,所以只能在有親緣關係的程序間傳遞資料。
3、管道的大小為pipe_buf,寫入資料不大於這個值則系統保證為原子操作,否則不保證為原子操作。
4、管道所傳遞的為無格式位元組流。所以需要管道兩端的程序之間事先定義好傳輸協議
Linux程序間通訊(IPC)之一 管道
管道是unix系統ipc的最古老的形式,並且所有的unix系統都提供這種通訊機制,當然也包括linux。這樣利用管道進行ipc管道具有如下限制 1 歷史原因造成管道是半雙工的,資料只能單向流動。如果想雙向通訊,必須要建立兩個管道。2 管道通訊雙方必須有親緣關係的程序之間 父子程序或者兄弟程序之間 2...
Linux程序間通訊 IPC
linux下的程序通訊手段基本上是從unix平台上的程序通訊手段繼承而來的。而對unix發展做出重大貢獻的兩大主力at t的貝爾實驗室及bsd 加州大學伯克利分校的伯克利軟體發布中心 在程序間通訊方面的側重點有所不同。前者對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了 system v...
Linux程序間通訊(IPC)
程序通訊有例如以下一些目的 a 傳輸資料 乙個程序須要將它的資料傳送給還有乙個程序。傳送的資料量在乙個位元組到幾m位元組之間 b 共享資料 多個程序想要操作共享資料。乙個程序對共享資料的改動,別的程序應該立馬看到。c 通知事件 乙個程序須要向還有乙個或一組程序傳送訊息。通知它 它們 發生了某種事件 ...