Linux 程序間通訊 管道

2021-08-18 12:20:48 字數 3037 閱讀 4466

程序間通訊(ipc,interprocess communication)是一組程式設計介面,讓程式設計師能夠協調不同的程序,使之能在乙個作業系統裡同時執行,並相互傳遞、交換資訊。這使得乙個程式能夠在同一時間裡處理許多使用者的要求。因為即使只有乙個使用者發出要求,也可能導致乙個作業系統中多個程序的執行,程序之間必須互相通話。ipc介面就提供了這種可能性。每個ipc方法均有它自己的優點和侷限性,一般,對於單個程式而言使用所有的ipc方法是不常見的。

程序間通訊目的:

1.資料傳輸:乙個程序需要將它的資料傳送給另乙個程序

2.資源共享:多個程序之間共享同乙份資源

3.通知事件:乙個程序需要向另乙個或一組程序傳送訊息,通知他們發生了某種事件

4.程序控制:有些程序希望完全控制另一給程序的執行(如debug程序),此時控制希望能夠攔截另乙個程序的所有陷入和異常,並能夠即使知道它的狀態改變。

管道:

管道它是unix中最古老的程序間通訊的形式。我們把從乙個程序連線到另乙個程序的乙個資料流稱為乙個「管道」。我們都知道在linux下「一切皆檔案」,其實這裡的管道就是乙個檔案。管道實現程序通訊就是讓兩個程序都能訪問該檔案。管道分為匿名管道和命名管道。

【匿名管道】

#include功能:建立乙個無名管道  

原型

int pipe(int fd[2]);

引數

fd:檔案描述符陣列,其中fd[0]表示讀端,fd[1]表示寫端

返回值:成功返回0,失敗返回錯誤**

管道的特徵:

1、只提供單向通訊,也就是說,兩個程序都能訪問這個檔案,假設程序1往檔案內寫東西,那麼程序2 就只能讀取檔案的內容。 

2、只能用於具有血緣關係的程序間通訊,通常用於父子程序建通訊 。

3、管道是基於位元組流來通訊的 。

4、依賴於檔案系統,它的生命週期隨程序的結束結束(隨程序)。 

5、其本身自帶同步互斥效果。

例項:

#include#include#include#includeint main(void)    

memset(buf, 0x00, sizeof(buf));

//讀取管道

if ((len = read(fds[0], buf, 100)) == -1)

//寫到螢幕

if (write(1, buf, len) != len)

}

}

管道的讀寫規則:

1、寫端的檔案描述符關閉,讀端一直讀。

2、寫端的檔案描述符沒關閉,但寫端也不寫資料,而讀端一直讀。

3、寫端一直寫資料,讀端不讀,也不關閉它的檔案描述符。

4、寫端寫資料,而讀端的檔案描述符關閉。

【命名管道】(named pipe 或 fifo)

管道應用的乙個限制就是只能在具有相同祖先(具有親緣關係)的程序間通訊。

如果我們想在不相關的程序之間交換資料,可以使用fifo檔案來做這項工作,它經常被稱為命名管道。

1、與匿名管道的區別:提供了乙個路徑名與之關聯,以fifo檔案的形式儲存於檔案系統中,能夠實現任何兩個程序之間通訊。而匿名管道對於檔案系統是不可見的,它僅限於在父子程序之間的通訊。 

2、 fifo是乙個裝置檔案,在檔案系統中以檔名的形式存在,因此即使程序與建立fifo的程序不存在血緣關係也依然可以通訊,前提是可以訪問該路徑。 

3、 fifo(first input first output)總是遵循先進先出的原則,即第乙個進來的資料會第乙個被讀走。

【命名管道的建立】:

1.可在命令列上建立: 

$ mkfifo filename

2.在程式裡建立: 

int mkfifo (const char* filename , mode_t mode); 

注釋:filename 為管道名稱;mode 為許可權

例項:

用命名管道實現client/server通訊:

首先建立makefile檔案:

.phony:all  

all:client server

client:client.c

gcc -o $@ $^

server:server.c

gcc -o $@ $^

.phony:clean

clean:

rm -f client server

#include #include #include #include #include #include #include int main()  

char buf[1024];

while(1)

else if(s==-1)

} return 0;

}

#include #include #include #include #include #include #include int main()  

int rfd = 0;

if((rfd = open("mypipe",o_rdonly))==-1)//以唯讀方式開啟管道

char buf[1024];

while(1)

else if(s==0)

else

} return 0;

}

Linux程序間通訊 管道

linux程序間通訊機制 1.同一主機程序間通訊機制 unix方式 有名管道fifo 無名管道pipe 訊號signal systemv方式 訊號量 訊息佇列 共享記憶體 2.網路通訊 rpc remote procedure call socket 管道管道是程序間通訊中最古老的方式,它包括無名管...

Linux程序間通訊 管道

管道 管道是一種最基本的程序間通訊機制,由pipe函式建立 include intpipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,f...

Linux 程序間通訊 管道

程序間通訊 a程序怎樣將 hello world 傳遞給b程序 i 利用檔案實現 需要乙個 中間人 進行傳遞 檔案 在磁碟中儲存 a先呼叫open函式開啟檔案,再用write函式寫檔案,b用read函式讀取檔案,但問題如下 1.如果a傳送了資料b進行了接收,但a的資料沒有被清空 2.如果a傳送了資料...