進程間通信——管道

進程間通信——管道

進程間通信——管道

1.管道的概念

管道是一種兩個進程間進行單向通信的機制。注意,傳遞數據是單向的,故管道又稱為半雙工管道。

2.管道的特點

(1)單獨構成一種獨立的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在與內存中。

(2)數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出數據。

3.管道的侷限性

(1)數據只能向一個方向流動,需要雙方通信時,需要建立起兩個管道;

(2)只能用於具有親緣關係的進程(比如,父進程和子進程之間);

(3)管道沒有名字,並且緩衝區大小是受限制的。

例:

進程間通信——管道

進程間通信——管道

進程間通信——管道

運行結果:

進程間通信——管道

即父子進程間的通信,父進程負責將數據寫入管道,子進程負責讀取管道中的內容。

4.有名管道

由於管道的一個不足之處就是沒有名字,所以只能夠讓有親緣關係的進程進行通信。因此,後來又有人提出了有名管道,不同於無名管道的是,它提供了一個路徑名與之關聯,並且以FIFO的文件形式存儲於文件系統中。(名字存在於文件系統中,內容存放在內存中。)

之所以稱之為FIFO,是因為它嚴格遵循先進先出(first in first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操作。

例:下面通過mkfifo創建一個有名管道,實現client與server之間的通信

server.c

進程間通信——管道

進程間通信——管道

Client.c

進程間通信——管道

進程間通信——管道

運行結果:

打開兩個終端,一個終端運行sercer.c,另一個終端運行client.c,如下:

進程間通信——管道

進程間通信——管道

上述結果表明該有名管道已創建成功,並可實現簡單的通信。但是要注意,要對FIFO文件的讀寫順序顛倒一下,也就是將定義FIFO文件名的宏的值對換一下


分享到:


相關文章: