作業系統實驗四 管道通訊

2021-10-01 08:34:50 字數 1610 閱讀 6047

一、實驗名稱

二、實驗目標:

學習如何利用管道機制、訊息緩衝佇列、共享儲存區機制進行程序間的通訊,並加深對上述通訊機制的理解。

三、實驗要求:

①編寫一c語言程式,使其用管道來實現父子程序間通訊。子程序向父程序傳送字串「is sending a message to parent!」;父程序則從管道中讀出子程序發來的訊息,並將其顯示到螢幕上,然後終止。

②執行該程式,觀察、記錄並簡單分析其執行結果。

函式總覽

pipe()函式:建立管道的方法

函式原型為:int pipe(int filedes[2]);

write()函式:寫入資料方法

函式原型為:int write(int pipe_fd,char *buffer,size_t len);

read()函式:讀取資料的方法

函式原型為:: int read(int pipe_fd,char *buffer,size_t len);

pipe函式

標頭檔案:#include

定義函式: int pipe(int filedes[2]);

函式說明:

建立管道,並將檔案描述符由陣列filedes 返回。

filedes[0]為管道裡的讀取端,用read從管道中讀資料

filedes[1]則為管道的寫入端,用write向管道中寫資料。

返回值: 若成功則返回0,否則返回-1

四、實驗內容

#include

#include

#include

#include

#define pid_t int;

intmain()

else

return0;

}

五、實驗結果

六、實驗結論

本實驗通過pipe函式建立了乙個父程序與子程序之間傳遞資料的管道。可以通過write函式向管道中寫入資料,對應的是filedes[1],通過read函式從管道中讀資料,對應的是filedes[0]。從輸出結果中可以看出,父程序確實通過管道接收到了子程序發來的訊息。多次反覆執行這個程式,發現輸出結果都是一樣的。不過心裡還是有乙個疑問,父程序會不會收不到子程序發來的訊息呢?因為這好像是乙個生產者與消費者的問題,假如說父程序在執行read函式時,子程序還沒有通過write函式把訊息寫到管道中,那麼父程序豈不是就什麼也讀不到了。帶著這個疑問,我在子程序的write函式之前sleep了兩秒,故意讓read函式的執行早於write。編譯執行之後,發現程式的輸出結果還是和原先一樣的,所不同的是,螢幕在輸出完「is the child process」之後,會稍微暫停一下,然後再顯示後面的內容。這種輸出結果與我最初的猜想是相矛盾的,後來經過分析得出的結論是,當父程序在執行read函式時,若管道中沒有資料可以讀取,那麼父程序就會阻塞自己,知道管道中有資料可以讀取為止。

作業系統之管道通訊

只能用於具有親緣關係的程序之間的通訊 使用pipe 建立乙個無名管道 標頭檔案 include 可以使用read 和write 對無名管道進行操作 int fd 2 pipe fd pipe建立管道,fd 0 指向無名管道的讀端,實現接收程序 系統呼叫read fd 0 buf,size 從管道出口...

作業系統實驗二 執行緒和管道通訊實驗

實驗內容 設有 元函式 f x,y f x f y 其中 f x f x 1 x x 1 f x 1 x 1 f y f y 1 f y 2 y 2 f y 1 y 1,2 請程式設計建 3 個併發協作程序或執行緒,它們分別完成 f x,y f x f y 執行緒間協作 include includ...

作業系統實驗四

學習如何利用管道機制 訊息緩衝佇列 共享儲存區機制進行程序間的通訊,並加深對上述通訊機制的理解。1 了解系統呼叫pipe 的功能和實現過程。2 編寫一c語言程式,使其用管道來實現父子程序間通訊。子程序向父程序傳送字串 is sending a message to parent 父程序則從管道中讀出...