系統程式設計——管道通訊

藍桉未遇釋槐鳥發表於2024-06-02

管道通訊

Linux系統提供了一種通訊方式,名字叫做管道通訊,顧名思義,管道是單向的,比如水管、燃氣管道等,換個說法就是管道是採用半雙工通訊的,也就是同一時刻只能完成傳送資料或者接收資料。

匿名管道

匿名管道的特點是沒有名稱,所以使用者無法使用open來建立和開啟,但是匿名管道進行資料讀寫的方式和普通檔案一樣,都是支援read()/write()操作的。

匿名管道的建立

image
其中pipefd引數是一個陣列型別,用於儲存堆管道進行讀寫的檔案描述符,pipefd[0]記錄管道讀取端的檔案描述符,pipeifd[1]記錄管道寫入端的檔案描述符
image

匿名管道的讀寫

對pipefd[0],pipefd[1]分別進行read與write的操作

有名管道

有名管道有檔名,可以被open,同樣也支援read/write訪問。

有名管道的建立

image
第一個引數是*const char *pathname,是建立的有名管道的檔案路徑
第二個引數是mode_t mode,是建立的有名管道的許可權

有名管道的讀寫

open開啟指定的有名管道後對其檔案描述符進行read與write操作

管道讀取資料的四種情況

image
image
image
image
總結:
如果一個管道的寫端一直在寫,而讀端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只寫不讀再次呼叫write會導致管道堵塞;
如果一個管道的讀端一直在讀,而寫端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只讀不寫再次呼叫read會導致管道堵塞;
而當他們的引用計數等於0時,只寫不讀會導致寫端的程序收到一個SIGPIPE訊號,導致程序終止,只寫不讀會導致read返回0,就像讀到⽂件末尾⼀樣。

思考:當一個管道寫入10位元組資料後,讀取5位元組資料,關閉管道再次開啟,此時讀取管道能否得到資料?

答:並不能讀取到資料,程序阻塞直到寫端有資料寫入。因為管道通訊是臨時的核心緩衝區而不是持久化儲存的通訊方式,當其兩個埠均關閉後,內容物會丟失。因此管道關閉後再開啟是無法讀取到之前尚未讀取完畢的資料的。


管道間四種通訊情況轉載自:https://blog.csdn.net/skyroben/article/details/71513385

相關文章