實驗四 程序的管道通訊

2021-04-26 13:52:31 字數 2060 閱讀 8542

實驗四 程序的管道通訊

實驗目的

1、了解什麼是管道

2、熟悉unix/linux支援的管道通訊方式

實驗內容

編寫程式實現程序的管道通訊。用系統呼叫pipe( )建立一管道,二個子程序p1和p2分別向管道各寫一句話:

child 1 is sending a message!

child 2 is sending a message!

父程序從管道中讀出二個來自子程序的資訊並顯示(要求先接收p1,後p2)。

實驗指導

一、什麼是管道

unix系統在os的發展上,最重要的貢獻之一便是該系統首創了管道(pipe)。這也是unix系統的一大特色。

所謂管道,是指能夠連線乙個寫程序和乙個讀程序的、並允許它們以生產者—消費者方式進行通訊的乙個共享檔案,又稱為pipe檔案。由寫程序從管道的寫入端(控制代碼1)將資料寫入管道,而讀程序則從管道的讀出端(控制代碼0)讀出資料。

二、管道的型別:

1、有名管道

乙個可以在檔案系統中長期存在的、具有路徑名的檔案。用系統呼叫mknod( )建立。它克服無名管道使用上的侷限性,可讓更多的程序也能利用管道進行通訊。因而其它程序可以知道它的存在,並能利用路徑名來訪問該檔案。對有名管道的訪問方式與訪問其他檔案一樣,需先用open( )開啟。

2、無名管道

乙個臨時檔案。利用pipe( )建立起來的無名檔案(無路徑名)。只用該系統呼叫所返回的檔案描述符來標識該檔案,故只有呼叫pipe( )的程序及其子孫程序才能識別此檔案描述符,才能利用該檔案(管道)進行通訊。當這些程序不再使用此管道時,核心收回其索引結點。

二種管道的讀寫方式是相同的,本文只講無名管道。

3、pipe檔案的建立

分配磁碟和記憶體索引結點、為讀程序分配檔案表項、為寫程序分配檔案表項、分配使用者檔案描述符

4、讀/寫程序互斥

核心為位址設定乙個讀指標和乙個寫指標,按先進先出順序讀、寫。

為使讀、寫程序互斥地訪問pipe檔案,需使各程序互斥地訪問pipe檔案索引結點中的直接位址項。因此,每次程序在訪問pipe檔案前,都需檢查該索引檔案是否已被上鎖。若是,程序便睡眠等待,否則,將其上鎖,進行讀/寫。操作結束後解鎖,並喚醒因該索引結點上鎖而睡眠的程序。

三、所涉及的系統呼叫   

1、pipe( )

建立一無名管道。

系統呼叫格式

pipe(filedes)

引數定義

int  pipe(filedes);

int  filedes[2];

其中,filedes[1]是寫入端,filedes[0]是讀出端。

該函式使用標頭檔案如下:

#include

#inlcude

#include

2、read( )

系統呼叫格式

read(fd,buf,nbyte)

功能:從fd所指示的檔案中讀出nbyte個位元組的資料,並將它們送至由指標buf所指示的緩衝區中。如該檔案被加鎖,等待,直到鎖開啟為止。

引數定義

int  read(fd,buf,nbyte);

int  fd;

char *buf;

unsigned  nbyte;

3、write( )

系統呼叫格式

read(fd,buf,nbyte)

功能:把nbyte 個位元組的資料,從buf所指向的緩衝區寫到由fd所指向的檔案中。如檔案加鎖,暫停寫入,直至開鎖。

引數定義同read( )。

四、參考程式

#include

#include

#include

int pid1,pid2;

main( )

else

else}}

五、執行結果

延遲5秒後顯示

child 1 process is sending message!

再延遲5秒

child 2 process is sending message!

六、思考題

1、程式中的sleep(5)起什麼作用?

2、子程序1和2為什麼也能對管道進行操作?

程序通訊 程序管道

程序間通訊的幾種常用方式 管道 命名管道 訊號 訊號量 共享記憶體 訊息佇列 套接字。管道 pipe 一種半雙工的通訊方式,資料只能單向流動且只能在具有共同祖先的程序間使用。命名管道 name pipe 也是一種半雙工的通訊方式,但他允許不相關程序間的通訊。訊號 sinal 乙個程序通過訊號通知其他...

程序的管道通訊

實驗四 程序的管道通訊 實驗目的 1 了解什麼是管道 2 熟悉unix linux支援的管道通訊方式 實驗內容 編寫程式實現程序的管道通訊。用系統呼叫pipe 建立一管道,二個子程序p1和p2分別向管道各寫一句話 child 1 is sending a message child 2 is sen...

作業系統實驗四 管道通訊

一 實驗名稱 二 實驗目標 學習如何利用管道機制 訊息緩衝佇列 共享儲存區機制進行程序間的通訊,並加深對上述通訊機制的理解。三 實驗要求 編寫一c語言程式,使其用管道來實現父子程序間通訊。子程序向父程序傳送字串 is sending a message to parent 父程序則從管道中讀出子程序...