1. 程式人生 > >Linux下管道通訊實現A程序死迴圈輸出A後被C程序處理輸出C

Linux下管道通訊實現A程序死迴圈輸出A後被C程序處理輸出C

一、管道通訊的實質

這部分學習參考此部落格

管道

管道的概念:

管道是一種最基本的IPC機制,作用於有血緣關係的程序之間,完成資料傳遞。呼叫pipe系統函式即可建立一個管道。有如下特質:

1. 其本質是一個偽檔案(實為核心緩衝區)

2. 由兩個檔案描述符引用,一個表示讀端,一個表示寫端。

3. 規定資料從管道的寫端流入管道,從讀端流出。

管道的原理: 管道實為核心使用環形佇列機制,藉助核心緩衝區(4k)實現。

管道的侷限性:

① 資料自己讀不能自己寫。

② 資料一旦被讀走,便不在管道中存在,不可反覆讀取。

③ 由於管道採用半雙工通訊方式。因此,資料只能在一個方向上流動。

④ 只能在有公共祖先的程序間使用管道。

常見的通訊方式有,單工通訊、半雙工通訊、全雙工通訊。


二、相關函式

 主要介紹三個函式,fork(),write()與read();

<1>、fork

     一個程序,包括程式碼、資料和分配給程序的資源。fork()函式通過系統呼叫建立一個與原來程序幾乎完全相同的程序,
也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。
    一個程序呼叫fork()函式後,系統先給新的程序分配資源,例如儲存資料和程式碼的空間。然後把原來的程序的所有值都
複製到新的新程序中,只有少數值與原來的程序的值不同。相當於克隆了一個自己。

<2>.write

1.功能
將資料寫入已開啟的檔案內
2.表頭檔案
#include<unistd.h>
3.定義函式
ssize_t write (int fd,const void * buf,size_t count);
4.函式說明
write()會把引數buf所指的記憶體寫入count個位元組到引數fd所指的檔案內。當然,檔案讀寫位置也會隨之移動。
5.返回值
如果順利write()會返回實際寫入的位元組數。當有錯誤發生時則返回-1,錯誤程式碼存入errno中。

<3>.read

1.功能
由已開啟的檔案讀取資料
2.表頭檔案 
#include<unistd.h>
3.定義函式 
ssize_t read(int fd,void * buf ,size_t count); 
4.函式說明 
read()會把引數fd所指的檔案傳送count個位元組到buf指標所指的記憶體中。若引數count為0,則read()不會有作用並返回0。返回值為實際讀取到的位元組數,如果返回0,表示已到達檔案尾或是無可讀取的資料,此外檔案讀寫位置會隨讀取到的位元組移動。  

三.問題描述

A程序有一個死迴圈,不停的在終端輸出資訊“A”。 這個時候,另外一個程序C被建立,嘗試將A程序輸出的“A”字元修改成“C”。

四。程式碼實現

五.執行結果




PS:菜鳥一隻,歡迎相互學習探討交流。不足之處還請指出。