![]() |
|||||||||
無名管道系統(tǒng)調(diào)用 |
|||||||||
本文關(guān)鍵字: linux 管道通信,linux 進(jìn)程通信方式 ,無名管道 1.管道創(chuàng)建與關(guān)閉說明 管道是基于文件描述符的通信方式,當(dāng)一個(gè)管道建立時(shí),它會(huì)創(chuàng)建兩個(gè)文件描述符fd[0]和fd[1],其中fd[0]固定用于讀管道,而fd[1]固定用于寫管道,如圖1所示,這樣就構(gòu)成了一個(gè)半雙工的通道。
管道關(guān)閉時(shí)只需將這兩個(gè)文件描述符關(guān)閉即可,可使用普通的close()函數(shù)逐個(gè)關(guān)閉各個(gè)文件描述符。 2.管道創(chuàng)建函數(shù) 創(chuàng)建管道可以通過調(diào)用pipe()來實(shí)現(xiàn)。表1列出了pipe()函數(shù)的語法要點(diǎn)。 表1 pipe()函數(shù)語法要點(diǎn)
3.管道讀寫說明 用pipe()函數(shù)創(chuàng)建的管道兩端處于一個(gè)進(jìn)程中,由于管道是主要用于在不同進(jìn)程間通信的,因此在實(shí)際應(yīng)用中沒有太大意義。實(shí)際上,通常先是創(chuàng)建一個(gè)管道,再調(diào)用fork()函數(shù)創(chuàng)建一個(gè)子進(jìn)程,該子進(jìn)程會(huì)繼承父進(jìn)程所創(chuàng)建的管道,這時(shí),父子進(jìn)程管道的文件描述符對(duì)應(yīng)關(guān)系如圖2所示。
此時(shí)的關(guān)系看似非常復(fù)雜,實(shí)際上卻已經(jīng)給不同進(jìn)程之間的讀寫創(chuàng)造了很好的條件。父子進(jìn)程分別擁有自己的讀寫通道,為了實(shí)現(xiàn)父子進(jìn)程之間的讀寫,只需把無關(guān)的讀端或?qū)懚说奈募枋龇P(guān)閉即可。例如,在圖3中將父進(jìn)程的寫端fd[1]和子進(jìn)程的讀端fd[0]關(guān)閉。此時(shí),父子進(jìn)程之間就建立起了一條“子進(jìn)程寫入父進(jìn)程讀取”的通道。
同樣,也可以關(guān)閉父進(jìn)程的fd[0]和子進(jìn)程的fd[1],這樣就可以建立一條“父進(jìn)程寫入子進(jìn)程讀取”的通道。另外,父進(jìn)程還可以創(chuàng)建多個(gè)子進(jìn)程,各個(gè)子進(jìn)程都繼承了相應(yīng)的fd[0]和fd[1]。這時(shí),只需關(guān)閉相應(yīng)端口就可以建立其各子進(jìn)程間的通道。 4.管道讀寫注意點(diǎn) 管道讀寫需注意以下幾點(diǎn): ● 只有在管道的讀端存在時(shí),向管道寫入數(shù)據(jù)才有意義。否則,向管道寫入數(shù)據(jù)的進(jìn)程將收到內(nèi)核傳來的SIGPIPE信號(hào)(通常為Broken pipe錯(cuò)誤)。 ● 向管道寫入數(shù)據(jù)時(shí),Linux將不保證寫入的原子性,管道緩沖區(qū)一有空閑區(qū)域,寫進(jìn)程就會(huì)試圖向管道寫入數(shù)據(jù)。如果讀進(jìn)程不讀取管道緩沖區(qū)中的數(shù)據(jù),那么寫操作將會(huì)一直阻塞。 ● 父子進(jìn)程在運(yùn)行時(shí),它們的先后次序并不能保證。因此,為了保證父子進(jìn)程已經(jīng)關(guān)閉了相應(yīng)的文件描述符,可在兩個(gè)進(jìn)程中調(diào)用sleep()函數(shù)。當(dāng)然這種調(diào)用不是很好的解決方法,在后面學(xué)到進(jìn)程之間的同步機(jī)制與互斥機(jī)制后,請(qǐng)讀者自行修改本小節(jié)的實(shí)例程序。 5.使用實(shí)例 在本例中,首先創(chuàng)建管道,之后父進(jìn)程使用fork()函數(shù)創(chuàng)建子進(jìn)程,后通過關(guān)閉父進(jìn)程的讀描述符和子進(jìn)程的寫描述符,建立起它們之間的管道通信。 /* pipe.c */ 將該程序交叉編譯,下載到開發(fā)板上的運(yùn)行結(jié)果如下: $ ./pipe 本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》 熱點(diǎn)鏈接:
1、Linux下進(jìn)程間通信方式-管道 |