linux學習 程序間通訊之管道

2021-07-24 04:07:40 字數 1390 閱讀 7953

在linux系統中,程序間通訊主要有以下幾種方式,這一期及以後的博文中將對各種程序間通訊進行介紹。

1、管道

2、命名管道

3、訊號

4、訊號量

5、訊息佇列

6、共享記憶體

7、套接字

在本文中,將對管道進行說明。

一、管道

管道是unix ipc的最老形式,並且所有u n i x系統都提供此種通訊機制,管道有兩種限制:

(1) 它們是半雙工的。資料只能在乙個方向上流動。

(2) 它們只能在具有公共祖先的程序之間使用。通常,乙個管道由乙個程序建立,然後該程序呼叫f o r k,此後父、子程序之間就可應用該管道。

有兩種方法來描繪乙個管道。左半圖顯示了管道的兩端在乙個程序中相互連線,右半圖則說明資料通過核心在管道中流動。

但是,乙個程序之間的管道基本上是不用的,一般是父程序與子程序之間進行通訊,如下圖。

當管道的一端被關閉後,下列規則起作用:

(1) 當讀乙個寫端已被關閉的管道時,在所有資料都被讀取後, read返回0,以指示達到了檔案結束處(從技術方面考慮,管道的寫端還有程序時,就不會產生檔案的結束。可以複製乙個管道的描述符,使得有多個程序具有寫開啟檔案描述符。但是,通常乙個管道只有乙個讀程序,乙個寫程序。

(2) 如果寫乙個讀端已被關閉的管道,則產生訊號 sigpipe。如果忽略該訊號或者捕捉該訊號並從其處理程式返回,則write出錯返回,error設定為epipe。

在寫管道時,常數pipe_buff規定了核心中管道快取器的大小。如果對管道進行 write呼叫,而且要求寫的位元組數小於等於pipe_buff,則此操作不會與其他程序對同一管道的write操作穿插進行。但是,若有多個程序同時寫乙個管道,而且某個或某些程序要求寫的位元組數超過pipe_buff位元組數,則資料可能會與其他寫操作的資料相穿插。

二、程式設計例項

#include 

#include

#include

#include

int main(void)

pid = fork();

if( pid < 0 )

//child

if( pid == 0)

//parent

else

if( pid > 0)

return

0;}

linux程序間通訊之管道通訊

一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...

linux程序間通訊之管道

下面幾節,將分別溫習下linux程序進通訊的幾種機制1 管道 管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。2 無名管道 它的特點就是 1 只能使用在具有親緣關係的程序之間的通訊 父子程序或者兄弟程序之間 因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。2 是乙個半雙工的通訊...

Linux程序間通訊之管道

管道,你可以把它想成一根資料線,連線了兩個程序,使他們可以互相通訊。更嚴謹來說,它是乙個檔案或者一塊共享區,乙個程序往裡面寫資料,另乙個程序從裡面拿資料,以此種方式完成程序間通訊。管道是unix系統ipc最古老的形式,所有的unix系統都提供此種通訊機制 unix系統ipc是各種程序通訊方式的統稱 ...