除了建立方式,fifo檔案與管道極為相似。fifo是非匿名的管道,通過系統呼叫mkfifo()存在於檔案系統中。
函式名稱
int mkfifo(const char *pathname, mode_t mode)
標頭檔案函式引數
說明pathname
建立fifo所用的路徑名
mode
指定fifo的屬性
返回值成功:0,失敗:-1
函式名稱
int open(const char *pathname, int flags)
引數說明
標頭檔案pathname
開啟的目標檔案
flags
開啟方式
返回值成功:檔案描述符,失敗:-1
flags(必須為一下三個引數中的乙個):
o_rdonly,o_wronly,o_rdwr
函式名稱
ssize_t read(int fd, void *buf, size_t count)
標頭檔案引數
說明fd
目標檔案描述符
buf讀取資料的快取
count
此次讀取的最多位元組數
返回值成功:此次讀取的位元組數,失敗:-1
函式名稱
int stat(const char *path, sturct stat *buf)
標頭檔案引數
說明path
指定要操作的目標檔案路徑
buf檔案屬性儲存的結構體快取位址
返回值成功:0,失敗:-1
函式名稱
mode_t umask(mode_t mask)
標頭檔案引數
說明mask
要替換的模式掩碼
返回值原mask值
函式名稱
ssize_t write(int fd, const void *buf, size_t count)
標頭檔案引數
說明fd
操作的檔案描述符
buf寫入資料的快取首位址
count
此次寫入資料的最大位元組數
返回值成功:寫入的位元組數,失敗:-1
函式名稱
int mkfifoat(int dirfd, const char *pathname, mode_t mode)
標頭檔案引數
說明dirfd
目錄檔案描述符
pathname
路徑mode
建立模式
返回值成功:0,失敗:-1
與mkfifo()的異同:
二者建立命名管道的方式是相同的;
當pathname指定的路徑為相對路徑時,mkfifo()是以程序的工作路徑為基礎,而mkfifoat()以dirfd所引用的目錄路徑為基礎路徑來建立命名管道;
當pathname指定的路徑為絕對路徑時,dirfd引數被忽略;
在pathname為相對路徑的情況下,若dirfd的值為at_fdcwd,則pathname被解釋為與程序的工作目錄相對的相對路徑(同mkfifo())。
乙個fifo特殊檔案(命名管道)與管道相似,不同的是fifo是作為檔案系統的一部分被訪問的。它可以被多個程序進行讀、寫。當多個程序通過fifo進行資料交換時,核心在內部進行資料傳送,並不將資料寫入檔案系統。因此,fifo檔案在檔案系統中沒有任何內容。fifo在檔案系統中的訪問入口僅作為乙個引用指標,使得各程序可以在檔案系統中訪問它。
核心僅為每個被程序開啟的fifo維持乙個例項,且只有雙端(讀端、寫端)都被開啟時才可以進行資料傳輸。通常情況下,開啟乙個fifo會阻塞至對端也被開啟。
程序可通過非阻塞方式開啟乙個fifo。在此情況下,以唯讀方式開啟的一端將會成功,以只寫開啟的一端將會失敗,並返回enxio(沒有此裝置或位址),除非對端(即讀端)早已被開啟。
在linux下,以阻塞或非阻塞的方式開啟乙個fifo進行讀或寫都會成功。posix將此視為未定義行為。當同一執行緒同時使用讀、寫端與自身進行通訊時,需要十分小心地避免死鎖。
#include#include#include#include#include#include#includeint main()
pid_t p_id = fork();
if(0 > p_id)
if(0 == p_id)
char buf[1024] = ;
ssize_t r_bytes = 0;
size_t l_bytes = 0;
while(true)
if(0 < r_bytes)}}
else
ssize_t w_bytes = 0;
char buf[1024] = "hello parent precess, i am greet to you by a fifo data dealer.";
int loop_cnt = 5;
while (loop_cnt--)
} return 0;
}return 0;
}
Linux 命名管道FIFO
管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管 道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供一 個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因 此,即使程序與建立fifo的程序不存在...
命名管道(FIFO)
client.c include include include include include define path home chen 7month 7 28 fifo my fifo 這個就是管道的名字,和建立的路徑 int main char buf 1024 while 1 close ...
命名管道 FIFO
解決了無關程序不能使用管道通訊的問題。pipe是線性的,乙個pipe只能有乙個輸入輸出,fifo是非線性的,乙個fifo可以有多個輸入或輸出。fifo的用途 1 shell命令使用fifo將資料從一條管道傳送到另一條時,無需建立中間臨時檔案。2 客戶程序 伺服器程序應用程式中,fifo用作匯聚點,在...