管道(pipe)
管道可用于具有親緣關(guān)系進(jìn)程間的通信菇夸,有名管道克服了管道沒(méi)有名字的限制悼院,因此淮逊,除具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信蚁趁;
實(shí)現(xiàn)機(jī)制:
管道是由內(nèi)核管理的一個(gè)緩沖區(qū)裙盾,相當(dāng)于我們放入內(nèi)存中的一個(gè)紙條。管道的一端連接一個(gè)進(jìn)程的輸出他嫡。這個(gè)進(jìn)程會(huì)向管道中放入信息闷煤。管道的另一端連接一個(gè)進(jìn)程的輸入,這個(gè)進(jìn)程取出被放入管道的信息涮瞻。一個(gè)緩沖區(qū)不需要很大鲤拿,它被設(shè)計(jì)成為環(huán)形的數(shù)據(jù)結(jié)構(gòu),以便管道可以被循環(huán)利用署咽。當(dāng)管道中沒(méi)有信息的話近顷,從管道中讀取的進(jìn)程會(huì)等待,直到另一端的進(jìn)程放入信息宁否。當(dāng)管道被放滿信息的時(shí)候窒升,嘗試放入信息的進(jìn)程會(huì)等待,直到另一端的進(jìn)程取出信息慕匠。當(dāng)兩個(gè)進(jìn)程都終結(jié)的時(shí)候饱须,管道也自動(dòng)消失。
從原理上台谊,管道利用fork機(jī)制建立蓉媳,從而讓兩個(gè)進(jìn)程可以連接到同一個(gè)PIPE上。最開(kāi)始的時(shí)候锅铅,上面的兩個(gè)箭頭都連接在同一個(gè)進(jìn)程Process 1上(連接在Process 1上的兩個(gè)箭頭)酪呻。當(dāng)fork復(fù)制進(jìn)程的時(shí)候,會(huì)將這兩個(gè)連接也復(fù)制到新的進(jìn)程(Process 2)盐须。隨后玩荠,每個(gè)進(jìn)程關(guān)閉自己不需要的一個(gè)連接 (兩個(gè)黑色的箭頭被關(guān)閉; Process 1關(guān)閉從PIPE來(lái)的輸入連接,Process 2關(guān)閉輸出到PIPE的連接)贼邓,這樣阶冈,剩下的紅色連接就構(gòu)成了如上圖的PIPE。
import os, time, sys
pipe_name = 'pipe_test'
def child( ):
pipeout = os.open(pipe_name, os.O_WRONLY)
counter = 0
while True:
time.sleep(1)
os.write(pipeout, 'Number %03d\n' % counter)
counter = (counter+1) % 5
def parent( ):
pipein = open(pipe_name, 'r')
while True:
line = pipein.readline()[:-1]
print 'Parent %d got "%s" at %s' % (os.getpid(), line, time.time( ))
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)
pid = os.fork()
if pid != 0:
parent()
else:
child()
[xiaorui@localhost ~ ]$ python f2.py
Parent 17355 got "Number 000" at 1418177682.7
Parent 17355 got "Number 001" at 1418177683.7
Parent 17355 got "Number 002" at 1418177684.7
Parent 17355 got "Number 003" at 1418177685.7
Parent 17355 got "Number 004" at 1418177686.7
Parent 17355 got "Number 000" at 1418177687.7
Parent 17355 got "Number 001" at 1418177688.7
Parent 17355 got "Number 002" at 1418177689.7
Parent 17355 got "Number 003" at 1418177690.71
Parent 17355 got "Number 004" at 1418177691.71
Parent 17355 got "Number 000" at 1418177692.71
Parent 17355 got "Number 001" at 1418177693.71
Parent 17355 got "Number 002" at 1418177694.71
Parent 17355 got "Number 003" at 1418177695.71