管道應用的乙個重大缺陷就是沒有名字,因此只能用於親緣程序之間的通訊。後來從管道的基礎上提出命名管道(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...