程序間通訊(FIFO)

2021-08-19 15:54:28 字數 2031 閱讀 1690

一、有名管道

管道沒有名字,因此它們只能用於有乙個公共祖先各個程序之間的通訊,我們無法在無親緣關係的程序之間程序ipc通訊。

有名管道即fifo,指先進先出,它是乙個半雙工的資料流,不同於管道的是每乙個fifo有乙個路徑名與之關聯,從而允許無

親緣之間的程序進行通訊。

二、建立的函式

fifo由mkfifo函式建立:int mkfifo(const char *pathname,mode_t mode);

其中pathname是乙個普通的路徑名,它是該fifo的名字。

mode引數指定檔案的許可權位,類似於open 第三個引數。

在建立出乙個fifo後,它必須開啟來讀,或者開啟來寫,所用的可以是open函式也可以是某個標準的i/o開啟函式

三、注意事項

如果當前尚沒有任何程序寫開啟某個fifo,那麼讀開啟該fifo的程序將阻塞;

如果當前尚沒有任何程序讀開啟某個fifo,那麼寫開啟該fifo的程序將阻塞;

四、例子:

啟動兩個不同的程序通過兩個有名管道程序通訊

fifo_server.c

#include

#include

#include

#include

#include

#include

#include

#include

#define maxline 1024

#define fifo1 "/tmp/fifo.1"

#define fifo2 "/tmp/fifo.2"

void perror(const char *s)

void server(int readfd,int writefd) ;

sprintf(buf,"hello world %d",i);

int n = write(writefd,buf,strlen(buf));

sleep(1); }

char buf[maxline] = ;

int n = read(readfd,buf,maxline);

if (n > 0)

printf("read from client:%s\n",buf); }

int main()

printf("create fifo success\n");

readfd = open(fifo2,o_rdonly,0);

writefd = open(fifo1,o_wronly,0);

printf("open fifo success\n");

unlink(fifo1);

unlink(fifo2);

server(readfd,writefd);

return 0; }

fifo_client.c

#include

#include

#include

#include

#include

#include

#include

#include

#define maxline 1024

#define fifo1 "/tmp/fifo.1"

#define fifo2 "/tmp/fifo.2"

void perror(const char *s)

void client(int readfd,int writefd) ;

int n = read(readfd,buf,maxline);

if (n > 0)

printf("read from server :%s\n",buf); }

char *buf = "goodby server";

write(writefd,buf,strlen(buf)); }

int main()

writefd = open(fifo2,o_wronly);

readfd = open(fifo1,o_rdonly);

client(readfd,writefd);

return 0 }

程序間通訊 fifo

fifo,同時也被稱為有命管道,未命名的管道只能用於有親緣關係之間的程序間的通訊,而命名管道可以實現兩個互不相關之間程序的通訊。在linux下,我們可以通過mkfifo命令建立命名管道,fifo實際上並不占取實際的儲存空間,只是在核心pipe中的乙個鏈結。我們可以通過其大小來檢視。fifo實際結構為...

程序間通訊之FIFO

管道使用起來很方便,但是沒有名字,因此只能用於具有親緣關係的程序之間進行通訊,而有名管道就克服了這一點,fifo管道提供了乙個路徑名與之相對應,即使程序不是親緣程序,只要能訪問到該路徑就能使用fifo進行通訊。有名管道的建立 include include int mkfifo const char...

linux 程序間通訊 FIFO

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