管道是如何進行進程間通信的
匿名管道和命名管道都是內(nèi)核的文件
匿名管道是Linux系統(tǒng)提供的一個系統(tǒng)函數(shù),可以通過這個函數(shù)來進行管道的使用
//命令行中 | 也起到管道的作用
a|b
管道背后的原理就是兩個文件描述符號齐疙,一個管道相當于一個隊列。有管道的頭和尾砾嫉,往管道的尾里去寫東西,從管道的頭里去讀東西窒篱。這個隊列如何控制頭跟尾的呢焰枢,就是兩個文件描述符蚓峦,來表示管道的兩端舌剂,讀取端:fd[0]
济锄、寫入端:fd[1]
。
在一個進程里創(chuàng)建一個匿名管道之后呢霍转,大概如下圖所示:
通過pipe函數(shù)創(chuàng)建了一個管道
創(chuàng)建了一份管道相當于創(chuàng)建了一份緩存荐绝,因為LINUX中是一切皆文件的。
如何讓創(chuàng)建的管道在兩個進程中用避消,fork()
子進程低滩,會復制父進程文件描述的結(jié)構體,fd數(shù)組也會復制一份岩喷。文件描述符相當于指針恕沫,子進程的復制相當于淺拷貝。
由于管道只能一端寫入另一端讀出纱意。所以通常父進程只保留讀取的fd婶溯,而子進程只保留寫入的fd。
父進程和子進程各關閉一個fd描述符偷霉。
在shell里的命令迄委,a和b是平級進程
。shell
首先創(chuàng)建一個子進程a然后在shell和a之間創(chuàng)建一個管道类少,然后fork出來了一個a這樣呢shell與a有通信關系的叙身,之后shell保留讀取端,a保留寫入端硫狞。之后shell再創(chuàng)建一個b信轿,這樣shell、a残吩、b都指向了同一個管道财忽, 這樣shell再把它的fd0和fd1都給關掉,這樣fork出來的b
命名管道
實現(xiàn)原理和匿名管道差不多世剖,本質(zhì)上都是內(nèi)核的文件定罢。命名管道會寫到磁盤文件里,不相關的進程也能一頭寫一頭讀旁瘫。