[toc]
(來自:
管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。
管道包括無名管道和命名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。
管道通訊是單向的,有固定的讀端和寫端。
資料被程序從管道讀出後,在管道中該資料就不存在了。
當程序去讀取空管道的時候,程序會阻塞。
當程序往滿管道寫入資料時,程序會阻塞。
管道容量為64kb(#define pipe_buffers 16
include/linux/pipe_fs_i.h)
在linux系統中,無名管道一旦建立完成後,操作無名管道建立無名管道pipe函式等同於操作檔案。無名管道的讀端被視作乙個檔案;無名管
道的寫端也被視作乙個檔案
標頭檔案:
《unistd.h》
函式原型:
int pipe(int pipefd[2]) ;
函式功能:
建立乙個可用於程序間通訊的無名管道;
函式引數:
pipefd[0]:讀段檔案描述符;pipefd[1]:寫端檔案描述符;
函式返回值:
成功:返回0;失敗:返回-1;
注意:這無名管道通訊的操作方式其實也跟操作檔案一樣。父子程序對管道分別有自己的讀寫通道,把無關的讀端或寫段關閉。
無名管道的讀寫規則**
a.從管道中讀取資料
<1>寫端不存在時,此時則認為已經讀到了資料的末尾,讀函式返回的讀出位元組數為0;
<2>寫端存在時,如果請求的位元組數目大於pipe_buf(ubuntu作業系統為65536),則返回管道中現有的資料位元組數,如果請求的位元組數目不大於pipe_buf,則放回管道中現有資料位元組數(此時,管道中資料量小於請求的資料量);或者返回請求的位元組數(此時,管道中資料量不小於請求的資料量)
從以上驗證我們可以看到:
<1>當寫端存在時,管道中沒有資料時,讀取管道時將阻塞
<2>當讀端請求讀取的資料大於管道中的資料時,此時讀取管道中實際大小的資料
<3>當讀端請求讀取的資料小於管道中的資料時,此時放回請求讀取的大小資料;
向管道中寫入資料:
向管道中寫入資料時,linux將不保證寫入的原子性,管道緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料。當管道滿時,讀程序不讀走管道緩衝區中的資料,那麼寫操作將一直阻塞。
注意:只有管道的讀端存在時,向管道中寫入資料才有意義。否則,向管道中寫入資料的程序將收到核心傳來的sigpipe訊號,應用程式可以處理該訊號,也可以忽略(預設動作則是使應用程式終止)。
**發現,當管道資料滿時,此時再向管道寫資料,寫端將阻塞。當讀端不存在時,寫端寫資料,核心將向其傳送sigpipe訊號,預設是終止程序。
#include
#include
int main( int argc , char **argv ) ;
read( fd[0] , buf , 5 ) ;
printf( "father read 1 is : %s\n",buf ) ;
strcpy( buf,"") ;
read( fd[0] , buf , 5 ) ;
printf( "father read 2 is : %s \n",buf ) ;
close(fd[0]) ;
exit(0) ;
}else
return
0 ;}
程序間通訊 無名管道
在上次的部落格中,我給大家介紹了程序間通訊的方式 有名管道。管道分為有名管道和無名管道,那麼此次我將給大家介紹一下另一種管道通訊 無名管道。有名管道是可以應用於任何兩個程序之間資料的單向傳遞,而無名管道是相對於有名管道的,無名管道在使用時產生,不使用後釋放,並不會在系統上留下任何痕跡。無名管道因其使...
程序間通訊 無名管道
1.無名管道 pipe 2.有名管道 fifo 3.訊號 signal 4.共享記憶體 share memory 5.訊息佇列 message queue 6.訊號燈集 semaphore set 7.套接字 1.只能用於具有親緣關係的程序之間的通訊 父子或兄弟程序 2.彈弓的通訊模式,具有固定的讀...
程序間通訊 有名管道 無名管道
顧名思義,管道就像是將資料放入到乙個長長的管子中一樣,肯定會有一端寫入資料,稱為寫端,有一段讀出資料,稱為讀端。既然是說像管子一樣那麼它肯定有大小吧,資源不是無窮無盡的,預設下管道的大小是64k,用ulimit a 可以檢視。1 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...