日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux IPC实践(3) --具名FIFO

發布時間:2025/3/17 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux IPC实践(3) --具名FIFO 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

FIFO具名/命名管道

? ?(匿名)管道應用的一個限制就是只能在具有共同祖先(具有親緣關系)的進程間通信。

? ?如果我們想在不相關的進程之間交換數據,可以使用FIFO文件來做這項工作,它經常被稱為命名管道;命名管道是一種特殊類型的文件.

?

創建一個命名管道

1)命名管道可以從命令行上創建:

? $?mkfifo?<filename>

2)命名管道在程序里創建:

#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode); //示例 int main() {if (mkfifo("p2", 0644) == -1)err_exit("mkfifo error"); }

FIFO與PIPE的區別:

1) 匿名管道由pipe函數創建并打開。

? ?命名管道由mkfifo函數創建,打開用open

2) FIFO(命名管道)與pipe(匿名管道)之間唯一的區別在它們創建與打開的方式不同,一但這些工作完成之后,它們具有相同的語義 ?(The?only?difference?between?pipes?and?FIFOs?is?the?manner?in?which?they?are?created?and?opened.??

Once?these?tasks?have?been?accomplished,?I/O?on?pipes?and?FIFOs?has?exactly??the?same?semantics.)

?

命名管道的打開規則

1)讀打開FIFO

? ?O_NONBLOCK?disable(阻塞):阻塞直到有相應進程為寫而打開該FIFO

? ?O_NONBLOCK?enable(非阻塞):立刻返回成功

//示例1: 阻塞, 只讀打開 int main() {int fd = open("fifo", O_RDONLY);if (fd == -1)err_exit("FIFO open error");cout << "fifo O_RDONLY open success" << endl; } //示例2: 只讀, 非阻塞打開 int main() {int fd = open("fifo", O_RDONLY|O_NONBLOCK);if (fd == -1)err_exit("FIFO open error");cout << "fifo O_RDONLY open success" << endl; }

2)寫打開FIFO

? ?O_NONBLOCK?disable(阻塞):阻塞直到有相應進程為讀而打開該FIFO

? ?O_NONBLOCK?enable(非阻塞):立刻返回失敗,錯誤碼為ENXIO

//示例1: 阻塞, 只寫打開 int main() {int fd = open("fifo", O_WRONLY);if (fd == -1)err_exit("FIFO open error");cout << "FIFO O_WRONLY open success" << endl; } //示例2: 非阻塞, 只寫打開 int main() {int fd = open("fifo", O_WRONLY|O_NONBLOCK);if (fd == -1)err_exit("FIFO open error");cout << "FIFO O_WRONLY open success" << endl; }

命名管道的讀寫規則

同匿名管道


/**FIFO示例, 兩個進程通過FIFO對拷數據:利用管道,兩個進程間進行文件復制。 1.進程writefifo: (1)讀文件(文件名從命令行參數中獲取) (2)寫入管道myFifo(管道由該進程創建) (3)關閉文件及管道2.進程readfifo: (1)讀管道myFifo (2)寫入文件[該文件有進程創建并打開] (3)關閉文件 (4)刪除管道 */ //1:writefifo int main(int argc, char *argv[]) {if (argc < 2)err_quit("Usage: ./writefifo <read-file-name>");// 創建管道if (mkfifo("myFifo", 0644) == -1)err_exit("mkfifo error");int outfd = open("myFifo", O_WRONLY); //打開FIFOint infd = open(argv[1], O_RDONLY); //打開文件if (outfd == -1 || infd == -1)err_exit("open file/fifo error");char buf[BUFSIZ];int readBytes;while ((readBytes = read(infd, buf, sizeof(buf))) > 0){write(outfd, buf, readBytes);}close(infd);close(outfd); } //2:readfifo int main(int argc, char *argv[]) {if (argc < 2)err_quit("Usage: ./writefifo <write-file-name>");int outfd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0644); //創建并打卡文件int infd = open("myFifo", O_RDONLY); //打開FIFOif (infd == -1 || outfd == -1)err_exit("open file/fifo error");char buf[BUFSIZ];int readBytes;while ((readBytes = read(infd, buf, sizeof(buf))) > 0){write(outfd, buf, readBytes);}close(outfd);unlink("myFifo"); //刪除FIFO }

總結

以上是生活随笔為你收集整理的Linux IPC实践(3) --具名FIFO的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。