進程間通信——管道
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文件名的宏的值對換一下
閱讀更多 有理想的代碼dog 的文章