09 程序間通訊 無名管道(父子程序間)

2021-07-30 14:13:37 字數 1867 閱讀 1092

[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 無名管道 管道是半雙工的,資料只能向乙個方向流動 需要雙方通訊時,需要...