UNIX網路程式設計卷2程序間通訊讀書筆記 有名管道

2021-06-25 22:06:36 字數 2575 閱讀 2142

(筆記從chinaunix copy過來的,然後自己看書的時候把認為需要注意的地方新增上,方便複習) 

二.有名管道

管道應用的乙個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道(

named pipe

或fifo

)提出後,該限制得到了克服。

fifo

不同於管道之處在於它提供乙個路徑名與之關聯,以

fifo

的檔案形式存在於檔案系統中。這樣,即使與

fifo

的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過

fifo

相互通訊,因此,通過

fifo

不相關的程序也能交換資料。值得注意的是,

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

1.有名管道的建立

用mkfifo可以重建乙個有名管道。

4.名稱::

mkfifo

功能:建立有名管道

標頭檔案:

#include

#include

函式原形:

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

引數:

返回值:

若成功則為0,若出錯則為-1。

該函式的第乙個引數是乙個普通的路徑名,也就是建立後fifo的名字。第二個引數與開啟普通檔案的open()函式中的mode 引數相同。如果mkfifo的第乙個引數是乙個已經存在的路徑名時,會返回eexist錯誤,所以一般典型的呼叫**首先會檢查是否返回該錯誤,如果確實返回該錯誤,那麼只要呼叫開啟fifo的函式就可以了。一般檔案的i/o函式都可以用於fifo,如close、read、write等等。

下面就是不同祖先通過管道通訊的例子。

/*2_5.c server*/

#include

#include

#include

#include

#include

int main(int argc,char *argv)

/*2_6.c client*/

#include

#include

#include

#include

#include

int main(int argc,char *argv)

先後臺執行伺服器程式(1_1.c),然後執行客戶程式(1_2.c)輸入幾個字母,客戶程式會通過有名管道傳到伺服器程式,伺服器程式把資訊列印到螢幕上。具體執行如下。

#./2_5 test&

#./2_6 test

2.有名管道的開啟規則

如果當前開啟操作是為讀而開啟fifo時,若已經有相應程序為寫而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為寫而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,成功返回(當前開啟操作沒有設定阻塞標誌)。

如果當前開啟操作是為寫而開啟fifo時,如果已經有相應程序為讀而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為讀而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,返回enxio錯誤(當前開啟操作沒有設定阻塞標誌)。

3.有名管道的讀寫規則

如果有程序開啟 寫 

fifo

,且當前

fifo

內沒有資料

(沒有寫入資料或資料之前全部被讀出

),則對於設定了阻塞標誌的讀操作來說,將一直阻塞。對於沒有設定阻塞標誌讀操作來說則返回

-1,當前

errno

值為eagain

,提醒以後再試。

對於設定了阻塞標誌的讀操作說,造成阻塞的原因有兩種:沒有開啟fifo的寫;另外就是fifo內沒有資料。解阻塞的原因則是fifo中有新的資料寫入,不論信寫入資料量的大小,也不論讀操作請求多少資料量。

如果沒有程序寫開啟fifo,則設定了阻塞標誌的讀操作會阻塞。

向fifo中寫入資料:

對於設定了阻塞標誌的寫操作:

當要寫入的資料量不大於pipe_buf時,linux將保證寫入的

原子性。

如果此時管道空閒緩衝區不足以容納要寫入的位元組數,則進入睡眠

,直到當緩衝區中能夠容納要寫入的位元組數時,才開始進行一次性寫操作。

當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。fifo緩衝區一有空閒區域,寫程序就會試圖向管道寫入資料,寫操作在寫完所有請求寫的資料後返回。

對於沒有設定阻塞標誌的寫操作:

當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。在寫滿所有fifo空閒緩衝區後,寫操作返回。

當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原子性。如果當前fifo空閒緩衝區能夠容納請求寫入的位元組數,寫完後成功返回;如果當前fifo空閒緩衝區不能夠容納請求寫入的位元組數,則返回eagain錯誤,提醒以後再寫。

UNIX網路程式設計卷2程序間通訊讀書筆記彙總

unix 網路程式設計卷 2程序間通訊讀書筆記 一 概述 網路程式設計卷 2程序間通訊讀書筆記 二 管道 1 網路程式設計卷 2程序間通訊讀書筆記 二 管道 2 網路程式設計卷 2程序間通訊讀書筆記 三 有名管道 1 網路程式設計卷 2程序間通訊讀書筆記 三 有名管道 2 網路程式設計卷 2程序間通...

unix環境高階程式設計 程序間通訊(2)

函式popen和pclose 常見的操作是建立乙個連線到另乙個程序的管道,然後讀其輸出或向其輸入端傳送資料,這兩個函式實現的操作是 建立乙個管道,fork乙個子程序,關閉未使用的管道端,執行乙個shell執行命令,然後等待命令終止。函式popen執行fork,呼叫exec執行cmdstring,返回...

UNIX 程序間通訊

linux繼承了at t和bsd以及早期的程序間的通訊 一般常用的通訊方式有 1 傳統的通訊方式 無名管道,有名管道和訊號。2 對於sys 5 的程序間通訊採用了共享記憶體,訊息佇列和訊號燈的形式。3 bsd,對於一般網路間的通訊採用來套接字的方式實現。1 無名管道的機制以及建立 對於無名管道只是用...