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:菜鳥一隻,歡迎相互學習探討交流。不足之處還請指出。