管道通訊
Linux系統提供了一種通訊方式,名字叫做管道通訊,顧名思義,管道是單向的,比如水管、燃氣管道等,換個說法就是管道是採用半雙工通訊的,也就是同一時刻只能完成傳送資料或者接收資料。
匿名管道
匿名管道的特點是沒有名稱,所以使用者無法使用open來建立和開啟,但是匿名管道進行資料讀寫的方式和普通檔案一樣,都是支援read()/write()操作的。
匿名管道的建立
其中pipefd引數是一個陣列型別,用於儲存堆管道進行讀寫的檔案描述符,pipefd[0]記錄管道讀取端的檔案描述符,pipeifd[1]記錄管道寫入端的檔案描述符
匿名管道的讀寫
對pipefd[0],pipefd[1]分別進行read與write的操作
有名管道
有名管道有檔名,可以被open,同樣也支援read/write訪問。
有名管道的建立
第一個引數是*const char *pathname,是建立的有名管道的檔案路徑
第二個引數是mode_t mode,是建立的有名管道的許可權
有名管道的讀寫
open開啟指定的有名管道後對其檔案描述符進行read與write操作
管道讀取資料的四種情況
總結:
如果一個管道的寫端一直在寫,而讀端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只寫不讀再次呼叫write會導致管道堵塞;
如果一個管道的讀端一直在讀,而寫端的引⽤計數是否⼤於0決定管道是否會堵塞,引用計數大於0,只讀不寫再次呼叫read會導致管道堵塞;
而當他們的引用計數等於0時,只寫不讀會導致寫端的程序收到一個SIGPIPE訊號,導致程序終止,只寫不讀會導致read返回0,就像讀到⽂件末尾⼀樣。
思考:當一個管道寫入10位元組資料後,讀取5位元組資料,關閉管道再次開啟,此時讀取管道能否得到資料?
答:並不能讀取到資料,程序阻塞直到寫端有資料寫入。因為管道通訊是臨時的核心緩衝區而不是持久化儲存的通訊方式,當其兩個埠均關閉後,內容物會丟失。因此管道關閉後再開啟是無法讀取到之前尚未讀取完畢的資料的。
管道間四種通訊情況轉載自:https://blog.csdn.net/skyroben/article/details/71513385