(筆記從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 無名管道的機制以及建立 對於無名管道只是用...