作業系統之管道通訊

2021-10-07 15:31:43 字數 2842 閱讀 2638

只能用於具有親緣關係的程序之間的通訊

使用pipe()建立乙個無名管道

標頭檔案#include

可以使用read()和write()對無名管道進行操作

int fd[2];

pipe(fd);

***pipe建立管道,fd[0]指向無名管道的讀端,實現接收程序(系統呼叫read(fd[0],buf,size)), 從管道出口fd[0]讀出size字元的訊息置入buf中;fd[1]指向無名管道的寫端,實現傳送程序(利用檔案系統的系統呼叫write(fd[1],buf,size)), 把buf的長度為size字元的訊息送入管道入口fd[1]。***

⚠️無名管道有乙個重大限制!它沒得名字,而且只能用於具有親緣關係的程序間通訊

且 程序結束後無名管道自動消失

!!!有名字了!

有名管道是對無名管道的一種改進有名管道又稱先進先出佇列(fifo),是一種存在於檔案系統種的特殊管道,有檔名,通過檔案進行通訊。它具有以下特點:

它可以使互不相關的兩個程序間實現彼此通訊;

該管道可以通過路徑名來指出,並且在檔案系統中是可見的。在建立了管道之後,兩個程序就可以把它當做普通檔案一樣進行讀寫操作,使用非常方便;

fifo嚴格地遵循先進先出規則,對管道及fifo的讀總是從開始處返回資料,對它們的寫則是把資料新增到末尾,它們不支援如 lseek()等檔案定位操作。

有名管道可以被任何知道其名字的程序開啟和使用。利用有名管道進行通訊,通訊雙方必須首先建立乙個有名管道,並與它的一端相連,才能開啟管道進行讀寫。當有名管道對應的檔案不再需要時,要顯示刪除。有兩種方式建立有名管道:

1. mkfifo

mkfifo fifoname
引數說明:fifoname是要建立的有名管道的名字。

標頭檔案#include

#include

#include

系統呼叫格式:

int mkfifo(const char *pathname,mode_t mode);

引數說明:***pathname***為字串指標,是乙個普通的路徑名,存放建立後的有名管道的檔名;***mode***為許可權值,指定所建立的有名管道檔案的訪問許可權。

引數mode有下列組合:

•s_irwxu:即00700許可權,代表該檔案所有者具有可讀、可寫及可執行的許可權;

•s_irusr或s_iread:即00400許可權,代表該檔案所有者具有可讀取的許可權;

•s_iwusr或s_iwrite:即00200許可權,代表該檔案所有者具有可寫入的許可權;

•s_ixusr或s_iexec:即00100許可權,代表該檔案所有者具有可執行的許可權;

•s_irwxg:即00070許可權,代表該檔案使用者組具有可讀、可寫及可執行的許可權;

•s_irgrp:即00040許可權,代表該檔案使用者組具有可讀的許可權;

•s_iwgrp:即00020許可權,代表該檔案使用者組具有可寫入的許可權;

•s_ixgrp:即00010許可權,代表該檔案使用者組具有可執行的許可權;

•s_irwxo:即00007許可權,代表其他使用者具有可讀、可寫及可執行的許可權;

•s_iroth:即00004許可權,代表其他使用者具有可讀的許可權;

•s_iwoth:即00002許可權,代表其他使用者具有可寫入的許可權;

•s_ixoth:即00001許可權,代表其他使用者具有可執行的許可權。

***返回值:***正確返回0,錯誤返回-1。

2. mknod

mknod fifoname p
引數說明:fifoname是要建立的有名管道的名字,引數p表明該檔案是個管道檔案。

標頭檔案:

#include

#include

#include

系統呼叫格式:

int mknod(const char *pathname, mode_t mode, dev_t dev);

***引數說明:***pathname為字串指標,是乙個普通的路徑名,存放建立後的有名管道的檔名;dev是檔案所在的裝置,對於有名管道,引數的值為0;mode為建立的有名管道的模式,指定所建立的有名管道檔案的訪問許可權,取值含義與mkfifo( )中的引數相同。但是還需要特別指明要建立管道檔案的型別:s_ififo或010.

返回值:正確返回0,錯誤返回-1。

有名管道建立後並不會自動開啟,需要系統呼叫open()姜對應的檔案開啟(開啟有名管道的方法和開啟普通檔案的方式一致)利用有名管道通訊的傳送程序以只寫方式(o_wronly)開啟,而接收程序以唯讀方式(o_rdonly)開啟

int open(const char*pathname,int flags);

引數說明:pathname是要開啟的有名管道的路徑名,flags是檔案開啟時的訪問方式。以下是引數flags可能的取值:

• o_rdonly:以唯讀方式開啟檔案;

• o_wronly:以只寫方式開啟檔案;

• o_rdwr:以可讀寫方式開啟檔案;

返回值:呼叫成功返回開啟有名管道檔案的讀端或寫端的檔案描述符(int型別),如果呼叫失敗,返回-1.

有名管道在程序結束後並不會消失,與普通檔案一致,存在於磁碟中,僅:程序結束後,有名管道檔案儲存的通訊資訊在通訊的兩個程序結束後自動丟失。

刪除有名管道 需要系統呼叫==unlink()==刪除

標頭檔案:

#include

系統呼叫格式

int unlink(const char * pathname);

引數說明:pathname指定需要刪除的有名管道檔名。

返回值:呼叫成功返回0,呼叫失敗,返回-1.

作業系統實驗四 管道通訊

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

作業系統 程序 程序間通訊 管道

linux中的 豎線 ps auxf grep mysql上面命令列裡的 豎線就是乙個管道,它的功能是將乙個命令 ps auxf 的輸出,作為後乙個命令 grep mysql 的輸入,從這功能描述,可以看出管道傳輸資料是單向的。如果想互相通訊,我們需要建立兩個管道才行。同時,這種管道是沒有名字,表示...

linux下程式設計 作業系統 管道通訊

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