linux有名管道fifo,程序間通訊

2022-01-24 23:44:13 字數 1923 閱讀 3430

命名管道(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的建立程序不存在親...