《Linux應用程序間通訊(二) 命名管道》

2022-09-16 03:18:10 字數 2475 閱讀 1483

命令列上建立命名管道:

$ mkfifo filename

程式中建立命名管道:

#include #include int mkfifo(const char *filename, mode_t mode);

備註:#include 是unix/linux系統的基本系統資料型別的標頭檔案,含有size_t,time_t,pid_t等型別。

#include是unix/linux系統定義檔案狀態所在的偽標準標頭檔案。

例程:建立乙個fifo命名管道

#include #include #include #include #include int main(int argc, char *ar**)

exit(exit_success);

}

備註:檔案許可權方面的知識有點模糊,需要回顧。

$ ls -lf(f選項會在顯示目錄條目時,在目錄後加乙個符號「/」表示資料夾 「|」表示管道)

prwxr-xr-x 1 root root 0 12月 17 17:02 fifo|

建立出來的fifo管道如上圖所示,其中第乙個字元p表示這是乙個管道,其中最後乙個|符號是由ls命令的-f選項所新增,也表示它是乙個管道。

fifo是以命名檔案的形式存在,而不是開啟的檔案描述符,所以在對它進行讀寫操作之前必須先開啟它。而且,對於fifo來說,傳遞給open函式的第乙個引數一定是乙個fifo的路徑名,而不是乙個檔名。

使用open開啟fifo檔案

1.fifo命名管道不能以o_rdwr的模式開啟,會產生二義性。(通常使用fifo只是為了單向傳遞資料)

2.如果確定需要程式之間雙向傳遞資料。①最好使用一對fifo或者管道,乙個方向使用乙個②採用先關閉再重新開啟fifo的方法來明確地改變資料流的去向(不常用)。

3.開啟fifo檔案和開啟普通檔案的另一點區別是:對open_flag(open的第二個引數)的o_nonblock的用法。

在這種情況下,open呼叫將阻塞,除非有乙個程序以寫方式開啟乙個fifo,否則它是不會返回。

即使沒有其他程序以寫方式開啟fifo,open呼叫也會成功並且立即返回。

在這種情況下,open呼叫將阻塞,直到有乙個程序以讀方式開啟程序。

這個函式呼叫總是立刻返回,但如果沒有程序以讀方式開啟fifo檔案,open呼叫將返回乙個錯誤-1並且fifo也不會被開啟。如果確實有乙個程序以讀方式開啟fifo檔案,那麼我們就我再可以通過它返回的檔案描述符對這個fifo檔案進行寫操作。

注意:由以上可知,必須先有程序以讀方式開啟fifo檔案,然後再有程序以寫方式開啟fifo檔案。

#include #include #include #include #include #include /* using string */#include /* o_rdonly in this file */

#define file_name "/home/test/readfifo"

int main(int argc, char *ar**)

}printf("read fifo file create successfull \n");

open(file_name, o_rdonly |o_nonblock);

printf("open the read fifo file is success \n");

exit(exit_success);

}

備註:string.h在使用到字元陣列時需要使用。

在open的函式呼叫中,如果是非阻塞。

read fifo file create successfull 

open the read fifo file is success

在open的函式呼叫中,如果是阻塞,即沒有使用o_nonblock

read fifo file create successfull

就會阻塞在open函式上,然後等待寫程序開啟這個函式,然後才會返回。

注意:linux中程序被阻塞時,並不消耗cpu資源。

對fifo進行讀寫操作

如果在open函式使用了o_nonblock模式,會影響到對fifo的read和write呼叫。

注意:pipe_buf是系統對fifo的乙個資料長度的限制,通常在標頭檔案limits.h可以找到它,通常值為4096位元組,也有特例。系統規定:在乙個以o_wronly方式(即阻塞方式)開啟的fifo中,如果寫入的資料長度小於等於pipe_buf,要麼全部一次性寫入,要麼乙個位元組也不寫入。

基於「注意」中的描述,如果出現一種情況:多個程式向乙個fifo中寫入資料的時候,為了保證這些寫入的資料不會相互交錯重疊,那麼就要求每次寫入的資料長度要小於等於pipe_buf位元組。

Linux程序間通訊 命名管道

ipc 命名管道 一 原理 管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道 named pip 或fifo 提出後,該限制得到了克服。fifo 不同於管道之處 在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中 命名管道是乙個裝置檔案,因此,即使程序...

linux程序間通訊(命名管道)

在處理程序間通訊的問題時,匿名管道只能在有親緣關係的程序中進行通訊。如何做到在任意兩個程序之間通訊,這就要用到命名管道。命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,在檔案系統中以檔案的形式存在,它的行為和匿名管道類似。可以使用mkfifo函式來建立乙個命名管道。int mkfifo con...

linux程序間通訊 命名管道

命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,它在檔案系統中以檔名的形式存在,但是它的行為卻和之前所講的沒有名字的管道 匿名管道 類似。有名管道是有名有形的,為了使用這種管道linux中設立了乙個專門的特殊檔案系統 管道檔案,它存在於檔案系統中,任何程序可以在任何時候通過有名管道的路徑和檔案...