linux下程序通訊 FIFO

2021-10-05 14:22:37 字數 3069 閱讀 8174

管道應用的乙個重大缺陷就是沒有名字,因此只能用於親緣程序之間的通訊。後來從管道的基礎上提出命名管道(named pipe, fifo)的概念,該限制得到了克服。fifo 不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案的形式存在於檔案系統中。這樣即使與fifo的建立程序不存在親緣關係的程序,只要可以訪問該路徑,就能彼此通過fifo通訊(能夠訪問該路徑的程序以及fifo的建立程序之間),因此,通過fifo不相關的程序也能交換資料。值得注意的是,fifo嚴格遵循先進先出(first in first out),對管道及fifo的讀總是從開始處返回資料,對它們的寫則是把資料新增到末尾。它們不支援諸如lsek() 等檔案定位操作。

#include

#include

intmkfifo

(const

char

*pathname,

//檔案的路徑

mode_t mode          //和open函式mode一樣

);

如果pathname路徑下的檔案已經存在,則mkfifo返回-1,errono將會返回eexist。

fifio在檔案系統中表現為乙個檔案,大部分的系統檔案呼叫都可以在fifo上面,比如read, open, write, close, unlink, stat等函式,但是seek函式不能對fifo呼叫。

可以呼叫open開啟fifo,請注意以下方面:

a 當以阻塞(未指定o_nonblock)方式唯讀開啟fifo的時候,則將會被阻塞,直到有其他程序以寫方式開啟該fifo。

b 類似的,當以阻塞(未指定o_nonblock)方式只寫開啟fifo的時候,則將會被阻塞,直到有其他程序以讀方式開啟該fifo

c 當以非阻塞方式(指定o_nonblock)方式唯讀開啟fifo的時候,則立即返回。當只寫open時,如果沒有程序為讀開啟fifo,則返回-1,其errno是enxio

如果寫入管道的資料量小於等於pipe_buf,則系統保證write為原子操作,多個程序同時寫管道,將不會出現穿插;如果寫入資料量大於pipe_buf,則系統將不保證write為原子操作,多個程序同時寫管道,則將有可能會穿插寫入。這個規則在命名管道中繼續適用。

本例為乙個client-server模式,伺服器端將會建立乙個fifo檔案(本例中為「/tmp/server」),並讀取該fifo檔案。客戶端則開啟該fifo檔案,並把其請求寫入該fifo檔案。伺服器端讀取該命令並執行之。

伺服器端的**為:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define server_fifo_name "/tmp/serv_fifo"

#define client_fifo_name "/tmp/cli_%d_fifo"

#define buffer_size 50

//傳遞資料的結構體

struct data_to_pass_st

;int

main()

sleep(10

);dosprintf

(client_fifo, client_fifo_name, mydata.client_pid)

; client_fifo_fd =

open

(client_fifo, o_wronly);if

(client_fifo_fd !=-1

)}}while

(read_res >0)

;close

(server_fifo_fd)

;unlink

(server_fifo_name)

;exit

(exit_success)

;}

客戶端**為:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define server_fifo_name "/tmp/serv_fifo"

#define client_fifo_name "/tmp/cli_%d_fifo"

#define buffer_size 50

struct data_to_pass_st

;int

main()

my_data.client_pid =

getpid()

;sprintf

(client_fifo, client_fifo_name, my_data.client_pid);if

(mkfifo

(client_fifo,

0777)==

-1)for

(times_to_send =

0; times_to_send <

5; times_to_send++

)close

(client_fifo_fd);}

}close

(server_fifo_fd)

;unlink

(client_fifo)

;exit

(exit_success)

;}

與管道相比,fifo最大的特點就是其在檔案系統中有fifo檔案存在,這樣就可以做到程序間通訊。

當然fifo也有它的侷限性。客戶端可以發請求到伺服器,但前提是要知道乙個公共的fifo通道,對於實現伺服器回傳應答到客戶端的問題,可以通過為每乙個客戶端建立乙個專用的fifo,來實現回傳應答。但也有不足,伺服器會同時應答成千上萬個客戶端,建立如此多的fifo是否會使系統負載過大,相應的如何判斷客戶端是否因意外而崩潰成為難題,或者客戶端不讀取應答直接退出,所以伺服器必須處理sigpipe訊號,並做相應處理。(當沒有程序為讀開啟fifo檔案時,write函式進行寫操作會產生sigpipe訊號)。

linux 程序間通訊 FIFO

建立乙個有名管道,解決無血緣關係的程序通訊,fifo 建立乙個fifo檔案,儲存在硬碟上。程序預先知道檔案的名字,便可以通過這個標識進行通訊。可以通過函式建立檔案 int mkfifo const char pathname,mode t mode 可以通過命令mkfifo穿件fifo檔案 void...

程序通訊FIFO

fifo fifo常被稱為命名管道,以區分管道 pipe 管道 pipe 只能用於 有血緣關係 的程序間。但通過fifo,不相關的程序也能交換資料。fifo是linux基礎檔案型別中的一種。但,fifo檔案在磁碟上沒有資料塊,僅僅用來標識核心中一條通道。各程序可以開啟這個檔案進行read write...

Linux程序間通訊 fifo測試

1 fifo原因 有名管道 檔案 安全性,不自動化,資料不完整沒有保障 鎖的機制 php開發 的時候,登入,session 2 測試 mkfifo 192.168.0.155 ncc fifo write.c 192.168.0.155 ncc fifo read.c 其中 fifo write.c...