Linux下程序間通訊 命名管道 mkfifo

2021-06-10 20:33:06 字數 2318 閱讀 5159

摘要:程序間通訊的方法有很多,fifo與管道是最古老,也是相對來說更簡單的乙個通訊機制。fifo相對管道有乙個優勢,就是fifo只要求兩個程序是同一主機的,而不要求程序之間存在親緣關係。fifo是存在於檔案系統的檔案,可以使用諸如open、read、write等函式來操作。本文總結網路和apue關於fifo討論,同時參考了linux系統手冊。

目錄 [隱藏]

fifo(命名管道)概述

mkfifo函式

命名管道讀寫規則

從fifo中讀取資料

從fifo中寫入資料

fifo示例

fifo是一種程序通訊機制,它突破通常管道無法進行無關程序之間的通訊的限制,使得同一主機內的所有的程序都可以通訊。fifo是乙個檔案型別,stat結構中st_mode指明乙個檔案結點是不是乙個fifo,可以使用巨集s_isfifo來測試這一點。

當乙個fifo存在於檔案系統裡時,我們只需要在想進行通訊的程序內開啟這個檔案就可以了。當然fifo作為乙個特殊的檔案,它有一些不同普通檔案特性,下面會詳細詳述它的讀寫規則,這些相對精通檔案來有一定的區別。

我們可以使用open、read、write來操作fifo檔案,從而實現程序間通訊的目的。在shell環境下,也可以直接使用fifo,這時往往與重寫向有一些關聯,一般系統都提供mkfifo實用程式來建立乙個fifo檔案,這個程式實際上使用mkfifo系統呼叫來完成這個事。

mkfifo建立乙個指定名字的fifo,它的函式原型如下:

#include

int mkfifo

(const

char

* pathname, mode_t mode

);返回值:成功,

0;失敗,

-1引數pathname指出想要建立的fifo路徑,引數mode指定建立的fifo訪問模式。這個訪問會與當前程序的umask程序運算,以產生實際應用的許可權模式。

mkfifo返回-1時表示建立過程中遇到某種錯誤,此時會設定errno,使用者可以檢測errno來取得進一步資訊:

fifo又叫命名管道,事實上它與管道確實在下許多相似之處,下面關於規則的討論很體現這個相似。

約定:如果乙個程序為了從fifo中讀取資料而阻塞開啟了fifo,那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。

約定:如果乙個程序為了向fifo中寫入資料而阻塞開啟fifo,那麼稱該程序內的寫操作為設定了阻塞標誌的寫操作。

fifo的長度是需要考慮的乙個很重要因素。系統對任一時刻在乙個fifo中可以存在的資料長度是有限制的。它由#define pipe_buf定義,在標頭檔案limits.h中。在linux和許多其他類unix系統中,它的值通常是4096位元組,red hat fedora9下是4096,但在某些系統中它可能會小到512位元組。

雖然對於只有乙個fifo寫程序和乙個fifo的讀程序而言,這個限制並不重要,但只使用乙個fifo並允許多個不同程序向乙個fifo讀程序傳送請求的情況是很常見的。如果幾個不同的程式嘗試同時向fifo寫資料,能否保證來自不同程式的資料塊不相互交錯就非常關鍵了à也就是說,每個寫操作必須「原子化」。

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

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

本段給出使用fifo乙個示例,它體現了兩個使用fifo的典型情景。

建立fifo

#include

#include

#include

#include

int main

()exit

(exit_success);

} 使用fifo

#include

#include

#include

fifo

"/tmp/my_fifo"

//本程式從乙個fifo讀資料,並把讀到的資料列印到標準輸出

//如果讀到字元「q」,則退出

int main

(int argc,

char

** argv

)printf

("準備讀取資料\n");

fd = open

(fifo, o_rdonly, 0

);if(fd

==-1 )

while

(1 )

//假設取到q的時候退出

if(buf_r

[0]==

'q')

break

;buf_r

[nread

]=0;

printf

("從fifo讀取的資料為:%s\n", buf_r

);sleep

(1);}}

原文:

Linux下程序間通訊 命名管道

管道是一種兩個程序間進行單向通訊的機制。因為管道傳遞資料的單向性,管道又稱為半雙工管道。管道的這一特點決定了器使用的侷限性。管道是linux支援的最初unix ipc形式之一,具有以下特點 1,資料只能由乙個程序流向另乙個程序 其中乙個讀管道,乙個寫管道 如果要進行雙工通訊,需要建 立兩個管道 2,...

Linux下程序間通訊之命名管道

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

Linux程序間通訊 命名管道

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