IPC-命名管道(FIFO)
来源:互联网 发布:淘宝应该怎么做 编辑:程序博客网 时间:2024/05/29 17:16
学习了匿名管道,我们知道它的一个不足之处就是没有名字,所以只能在两个相关进程之间使用,而且这两个相关进程要有一个公共祖先进程。那如果两个进程没有血缘关系,也想进行通信该怎么办呢?方法就是命名管道。
命名管道(FIFO):
- 突破了匿名管道只能用于具有血缘关系间的进程通信,它可以使两个互不相干的进程彼此通信。
- 提供了一个路径名与之相关联,以FIFO文件形式存储在文件系统中。
- 与匿名管道相同是,命名管道也遵守遵守先进先出的规则,第一个被写入的数据总是首先从管道被读出。
- FIFO不同于匿名管道之处在于它提供一个路径名与之关联,以FIFO文件形式存在文件系统中。FIFO是一个设备文件,因此,只要可以访问该路径,就能通过FIFO相互通信。
命名管道的创建:
Linux下有两种创建方式创建命名管道。一是在shell下交互的建立一个命名管道,而是使用系统函数建立命名管道。
Shell方式下可使用mkfifo和mkdon命令来创立命名管道:mkdon namepipi
创建命名管道的系统函数有两个mkdon()和mkfifo()。
两函数定义:
#include<sys/stat.h>int mkfifo(const char *path,mode_t mode);int mkdon(const char *path,mode_t mode,dev_t dev);
//可以指定路径,名字,打开方式。
参数:path为创建的命名管道的全路径名,mode为创建的命名管道的模式,指的是其存储权限。modon独有的dev为设备值,只有创建设备文件时才需要dev。
返回值:当调用成功时返回0,调用失败时返回-1;
当我们用mkfifo或者mkdon创建FIFO时,要用open打开它。确实,正常的文件I/O函数(如close、read、write和unlink)都需要FIFO。
当我们open一个FIFO时,会产生如下影响:
- 阻塞打开(没有指定O_NONBLOCK)。对于读,只读open阻塞,直到某个进程以写而打开FIFO为止,如果有数据,读取完管道里面数据。只写open,阻塞到某进程以读方式打开FIFO。
- 非阻塞打开(指定O_NONBLOCK),则只读open立即返回。如果没有进程以读打开FIFO,那么只写open返回-1。
若write一个没有以读方式打开的FIFO时,将会产生信号SIGPIPE。若FIFO最后一个写进程关闭了该FIFO,则将为以读打开该FIFO的进程产生一个文件结束标志。
代码实例:
这里是test中写入i am test 然后通过命名管道receive读取并打印。
test.c
/************************************************************************* > File Name: test.c > Author: > Mail: > Created Time: Mon 22 May 2017 04:47:33 AM PDT ************************************************************************/#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>int main(){ if(mkfifo("tmp",0666)==-1) { printf("myfifo error!"); exit(1); } else { int n=open("tmp",O_WRONLY); if(n==-1) { printf("open error!\n"); exit(1); } else { char *mesg="i am test!"; write(n,mesg,strlen(mesg)+1); } } return 0;}
receive.c中
/************************************************************************* > File Name: revive.c > Author: > Mail: > Created Time: Mon 22 May 2017 07:28:57 AM PDT ************************************************************************/#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<fcntl.h>int main(){ int fd=open("tmp",O_RDONLY); if(fd==-1) { printf("receive error!\n "); exit(1); } else { char mesg[100]; ssize_t s= read(fd,mesg,sizeof(mesg)); mesg[s-1]='\0'; printf("%s\n",mesg); } return 0;}
阅读全文
0 0
- IPC-命名管道(FIFO)
- 【IPC通信】FIFO命名管道
- 【IPC通信】命名管道FIFO
- IPC实现机制(二)---命名管道(FIFO)
- IPC——命名管道FIFO
- 命名管道(FIFO)
- 命名管道(FIFO)
- 命名管道(FIFO)
- 命名管道 FIFO(转)
- FIFO管道/命名管道(半双工)
- Linux进程间通信(IPC)之二——命名管道(FIFO)
- Linux进程间通信(IPC)之二——命名管道(FIFO)
- Linux进程间通信(IPC)之二——命名管道(FIFO)
- Linux进程间通信(IPC)之二——命名管道(FIFO)
- Linux进程间通信(IPC)编程实践(二) FIFO命名管道
- IPC ------有名管道fifo
- 【IPC】管道和FIFO
- 命名管道(FIFO)聊天程序
- 121Best Time to Buy and Sell Stock
- 支持向量机(SVM):基本原理
- 树莓派3B ssh登录 密码无限错误
- redis主从复制
- MPAndroidChart之LinChart(3)scale缩放
- IPC-命名管道(FIFO)
- Android 之 内存管理
- Maven Rollback a Release
- Android在Activity中获取手机屏幕的宽高
- oc中关于pch文件
- freemarker list (长度,遍历,下标,嵌套,排序)
- [李景山php] yaf 的运行流程图
- windows下修改host不生效的解决方法
- Java多线程ThreadLocal