IPC-管道

管道是進(jìn)程間的一種方式,多個(gè)進(jìn)程可以利用管道進(jìn)行通信。對(duì)于管道的理解可以從與共享內(nèi)存的區(qū)別入手。共享內(nèi)存是通過獲得相同的內(nèi)存地址,對(duì)同一塊內(nèi)存操作,而管道就好比兩個(gè)進(jìn)程間建立一個(gè)地下通道,必須有打開通道和關(guān)閉通道的操作。

管道是半雙工的,所有數(shù)據(jù)流都是按一定順序進(jìn)行存取的。管道分為兩種:一種是有名管道;一種是無名(匿名)管道。
無名管道:pipe創(chuàng)建,主要用于父子進(jìn)程之前的數(shù)據(jù)傳遞。
有名管道:mkfifo創(chuàng)建,主要用于不相關(guān)進(jìn)程間通信可以理解為創(chuàng)建一個(gè)文件,任何進(jìn)程都可以去讀只不過這個(gè)文件和普通文件不一樣,生成了有名管道后,就可以使用一般的文件I/O函數(shù)如open、close、read、write等來對(duì)它進(jìn)行操作。
無名管道:

從代碼中可以看到,無名管道的創(chuàng)建會(huì)同時(shí)打開兩個(gè)句柄,file_descriptors是一個(gè)元素個(gè)數(shù)為2的數(shù)組。fork之后具體要做什么取決于我們想要的數(shù)據(jù)流的方向。對(duì)于從父進(jìn)程到子進(jìn)程的管道,父進(jìn)程關(guān)閉管道的讀端(fd[0]),子進(jìn)程關(guān)閉管道的寫端(fd[1])。

有名管道:

有名管道與無名管道的區(qū)別在于有名管道可以根據(jù)相同路徑在多個(gè)進(jìn)程中(mkfifo)相同的管道句柄,然后根據(jù)這個(gè)句柄就可以使用file的操作(open,read,write)進(jìn)行管道數(shù)據(jù)的讀寫了。從代碼中注意的是打開管道的有阻塞和非阻塞方式。
對(duì)于管道的使用有以下幾點(diǎn):
讀端不讀,寫端一直寫。導(dǎo)致管道寫滿,當(dāng)再次往管道里面寫時(shí),會(huì)導(dǎo)致阻塞直到有空間才會(huì)返回(設(shè)置非阻塞方式除外)。
寫端不寫,但是讀端一直讀,導(dǎo)致管道為空,當(dāng)從管道里面讀時(shí),會(huì)導(dǎo)致阻塞直到有數(shù)據(jù)才會(huì)返回(設(shè)置非阻塞方式除外)
讀端一直讀,且fd[0]保持打開,而寫端寫了一部分?jǐn)?shù)據(jù)不寫了,并且關(guān)閉fd[1]。
讀端讀了一部分?jǐn)?shù)據(jù),不讀了且關(guān)閉fd[0],寫端一直在寫且f[1]還保持打開狀態(tài)。

end

專注音視頻技術(shù)
編程語言學(xué)習(xí)筆記以及互聯(lián)網(wǎng)信息分享與交流
掃碼關(guān)注

