程序的管道通訊

2021-08-30 07:54:20 字數 2065 閱讀 8113

實驗四 程序的管道通訊

實驗目的

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.匿名管道通訊 適合用於父子程序間的通訊 include include include 匿名管道通訊,本機父子程序通訊方式 int main else waitpid pid,nu...

程序通訊 管道通訊

程序間通訊 目的 資料傳輸 乙個程序需要將它的資料傳送給另乙個程序 資源共享 多個程序之間共享同樣的資源 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件 程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及...