进程间通信--FIFO(命名管道)
Posted 醉深梦始
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通信--FIFO(命名管道)相关的知识,希望对你有一定的参考价值。
匿名管道只能解决具有亲缘关系的进程间通信,但是任意两个进程间不能通信。
FIFO不同于管道之处在于提供了一个路径名与之关联,以FIFO的文件形式存储到文件系统中。
命名管道是一个设备文件,因此进程间不需要亲缘关系,只要可以访问与之关联的路径即可,就能同FIFO通信
命名管道通过mkfifo命名一个管道,然后通过open read write进行文件读写
管道可以根据open选项设置阻塞非阻塞
注意:命名管道可能出现粘包的问题
命名管道代码示例:
server.cpp #include<iostream> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include <unistd.h> int main(){ unlink("../myfifo"); int ret = mkfifo("../myfifo",S_IFIFO|0666); if (ret == -1) { printf("fifo create err\n"); return -1; } int fd = open("../myfifo",O_RDWR); if (fd == -1) { printf("open file err\n"); return -1; } int n = 0; while(1) { char buf[1024] = {0}; n = read(fd,buf,1024); if(n > 0) { printf("recv[%d]%s\n",n,buf); } else { printf("recv buf[%d] failed\n",n); break; } } close(fd); }
client.cpp #include <iostream> #include <stdlib.h> #include <sys/types.h> #include <fcntl.h> #include <sys/types.h> #include <unistd.h> #include <string.h> int main(){ int fd = open("../myfifo",O_RDWR); if (fd == -1) { printf("open fifo file err\n"); return -1; } int num = 10; char buf[1024] = {0}; while(num--) { sprintf(buf,"hello server,..num=%d\n",num); if(write(fd,buf,strlen(buf)) == -1) { printf("write fifo err\n"); return -1; } usleep(100); } close(fd); }
以上是关于进程间通信--FIFO(命名管道)的主要内容,如果未能解决你的问题,请参考以下文章