linux命名管道 fifo

2021-10-03 06:54:08 字數 2494 閱讀 2621

除了建立方式,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用作匯聚點,在...