管道由於傳遞資料只能單向傳遞,因此又稱半雙工管道,它是一種兩個程序間進行單向通訊的機制.
侷限性:
*資料只能由乙個程序流向另乙個程序,若要進行全雙工通訊,則需建立兩個管道.
*管道只能用於具有親緣關係的程序間通訊.
*管道無名字.
*管道的緩衝區大小受限制.
*管道所傳遞的是無格式的位元組流,這就要求管道的輸入和輸出事先約定好資料格式.
使用管道進行通訊時,兩端的程序向管道讀寫資料是通過建立管道時,系統設定的檔案描述符進行的.
管道是乙個特殊的檔案,這個檔案只存在於記憶體中.在建立管道時,系統為管道分配乙個頁面作為資料緩衝區,進行管道通訊的兩個程序通過讀寫這個緩衝區來進行通訊.
寫入的資料每次新增在管道緩衝區的末尾,讀資料時都是從緩衝區的頭部讀出資料.
linux下建立管道可以通過函式pipe完成,該函式如果呼叫成功返回0,並且陣列中將包含兩個新的檔案描述符.如果有錯誤發生,則返回-1.
管道兩端分別用描述符fd[0]及fd[1]來描述.
管道兩端的任務固定.fd[0]為管道讀端,fd[1]為管道寫端.
管道是一種檔案,建立成功後就可以作為一般檔案來使用,因此對檔案操作的i/o函式都可以用於管道,如read(),write()等.
管道的一般用法
程序在使用fork函式建立子程序前先建立乙個管道,該管道用於在父子程序間通訊.然後建立子程序,之後父程序關閉管道讀端,子程序關閉管道寫端,父程序負責向管道寫資料,子程序負責讀資料.也可以父程序關閉管道寫端,子程序關閉管道讀端.
要讀取管道中資料的程序要關閉管道寫端fd1,同時向管道寫資料的程序應關閉讀端fd0.(因為是用於具有親緣關係的程序間通訊,所以共享檔案描述符).使用前,應及時關閉不需要的另一端,避免錯誤的發生.
程序在管道的讀端讀資料時,
1.如果管道寫端不存在,則讀程序認為已經讀到資料的末尾,讀函式返回讀出的位元組數為.
2.若管道寫端存在,
(1)且請求讀取的位元組數大於pipe_buf,則返回管道中所有資料,
(2)如果不大於pipe_buf,則返回管道中現有的所有資料(管道中資料量小於請求的資料量). 或返回請求的位元組數(管道中資料量大於等於請求的資料量)
如果某程序希望向管道中寫入資料,那麼該程序應關閉讀端fd0檔案描述符,同時管道另一端的程序關閉fd1.
向管道寫入資料時,linux不保證寫入的原子性.
>原子性:操作在任何時候都不能被任何原因打斷,操作要麼不做要麼就一定完成.
管道緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料,若讀程序不讀走緩衝區的資料,則寫操作一直被阻塞等待.
在寫管道時,如果請求的位元組數小於等於pipe_buf,則多個程序對同一管道的寫操作不會交錯進行,但如果有多個程序同時寫乙個管道,且某些程序要求寫的位元組數超過pipe_buf所能容納時,則多個寫操作的資料可能會交錯.
>只由管道讀端存在時,向管道中寫入資料才有意義.否則,向管道中寫入資料的程序將收到核心傳來的sigpipe訊號,如果忽略或撲捉該訊號並從其處理程式返回,則write出錯,錯誤碼為epipe.
程序間通訊1
管道通訊 管道是單向 先進先出的,他把乙個程序的輸出和另乙個程序的輸入連在一起。兩個程式之間傳遞資料的一種簡單方法是使用popen和pclose。include file popen const char command,const char type int pclose file stream ...
程序間的通訊(1)
根據程序間通訊資訊量的不同,劃分為兩個類別 控制資訊的通訊 低階通訊 和大批量資料資訊的通訊 高階通訊 常見的通訊介面有 用於實現低階通訊的有軟中斷訊號 訊號量集,實現高階通訊的有管道 訊息佇列 共享記憶體等。軟中斷訊號 是作業系統用來通知程序有事件發生的一種訊號機制,用於實現簡單的非同步通訊的一些...
程序間通訊(1) 管道
linux下一切皆檔案,我們可以建立乙個管道檔案進行通訊,實際上是呼叫pipe函式在核心中開闢一塊緩衝區 稱為管道 用於通訊,管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程...