命名管道(fifo)不同於無名管道之處在於它提供了乙個路徑名與之關聯,以 fifo 的檔案形式存在於檔案系統中,這樣,即使與 fifo 的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能夠彼此通過 fifo 相互通訊,因此,通過 fifo 不相關的程序也能交換資料。
命名管道(fifo)和無名管道(pipe)有一些特點是相同的,不一樣的地方在於:
1、fifo 在檔案系統中作為乙個特殊的檔案而存在,但 fifo 中的內容卻存放在記憶體中。
2、當使用 fifo 的程序退出後,fifo 檔案將繼續儲存在檔案系統中以便以後使用。
3、fifo 有名字,不相關的程序可以通過開啟命名管道進行通訊。
int mkfifo(const char *pathname, mode_t mode);用於建立乙個管道
int open(const char *pathname, int flags);
用於開啟乙個管道
開啟fifo檔案和普通檔案的區別有2點:
第乙個是不能以o_rdwr模式開啟fifo檔案進行讀寫操作。這樣做的行為是未定義的。
因為我們通常使用fifo只是為了單向傳遞資料,所以沒有必要使用這個模式。
如果確實需要在程式之間雙向傳遞資料,最好使用一對fifo或管道,乙個方向使用乙個。或者採用先關閉在重新開啟fifo的方法來明確改變資料流的方向。
第二是對標誌位的o_nonblock選項的用法。
使用這個選項不僅改變open呼叫的處理方式,還會改變對這次open呼叫返回的檔案描述符進行的讀寫請求的處理方式。
o_rdonly、o_wronly和o_nonblock標誌共有四種合法的組合方式:
open函式呼叫中的引數標誌o_nonblock會影響fifo的讀寫操作。
規則如下:
注意這個限制的作用:
當只使用乙個fif並允許多個不同的程式向乙個fifo讀程序傳送請求的時候,為了保證來自不同程式的資料塊 不相互交錯,即每個操作都原子化,這個限制就很重要了。如果能夠包子所有的寫請求是發往乙個阻塞的fifo的,並且每個寫請求的資料長父小於等於pipe_buf位元組,系統就可以確保資料絕不會交錯在一起。通常將每次通過fifo傳遞的資料長度限制為pipe_buf是乙個好辦法。
其中。pipe_buf是fifo的長度,它在標頭檔案limits.h中被定義。在linux或其他類unix系統中,它的值通常是4096位元組。
write.c
#include #include #include #include #include #include #define fifo_name "/tmp/myfifo"int main()
} printf("create fifo succeed!\n");
int fifo_fd = open(fifo_name,o_wronly);
printf("open fifo succeed!\n");
if(fifo_fd < 0)
int i = 1;
for(;i < 100; i++)
printf("write succeed: %d\n",i);
close(fifo_fd);
return 0;
}
read.c
#include #include #include #include #include #include #define fifo_name "/tmp/myfifo"int main()
int i;
sleep(5);
while(1)
close(fifo_fd);
return 0;
}
通訊過程中,當所有讀程序退出後,寫程序向命名管道內寫資料時,寫程序也會(收到 sigpipe 訊號)退出。
本例子中,寫程序退出後,讀程序繼續迴圈,當再次有寫程序啟動時,讀程序就會再次讀到資料。
linux 有名管道(FIFO)
管道的緩衝區是有限的 管道制存在於記憶體中,在管道建立時,為緩衝區分配乙個頁面大小 管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作乙個訊息 或命令 或記錄 等等 多個寫程序,乙個讀程序。可以參考我之前的部落格 一旦設定了阻塞標誌,呼叫mkfif...
Linux程序間通訊 有名管道FIFO
常規的匿名管道通過pipe建立一片記憶體緩衝區,並對外提供兩個檔案描述符,用於唯讀或者只寫操作。但其使用範圍很小,只能用於父 子程序間的通訊。因此linux還提供有名管道的支援。管道的本質是一片可以讀寫的緩衝區域,linux將其描述為檔案 unix思想 一切io皆是檔案 對於有名管道,其主要特點是 ...
FIFO 有名管道
有名管道相關的關鍵概念 管道應用的乙個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中。這樣,即 使與fifo的建立程序不存在親...