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; }命名管道的讀寫規則
同匿名管道
總結
以上是生活随笔為你收集整理的Linux IPC实践(3) --具名FIFO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阔步向前冲,拥抱云计算-【软件和信息服务
- 下一篇: linux 其他常用命令