进程间通信___命名管道(FIFO)
命名管道(FIFO)
基本概念
命名管道和一般的管道基本相同,但也有一些显著的不同:
命名管道是在文件系统中作为一个特殊的设备文件而存在的。
不同祖先的进程之间可以通过管道共享数据。
当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。
管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是,通过FIFO,不相关的进程也能交换数据。
命名管道创建和操作::
#include
#include
int mkfifo(const char *pathname,
mode_t mode);
返回:若成功则为0,若出错则为-1
一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I/O函数(close、read、write、unlink等)都可用于FIFO。
当打开一个FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响:
(1) 在一般情况中(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。类似,为写而打开一个FIFO要阻塞到某个其他进程为读而打开它。
(2) 如果指定了O_NONBLOCK,则只读打开立即返回,但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。
类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。若某个FIFO的最后一个写进程关闭了该FIFO,则将为该FIFO的读进程产生一个文件结束标志。
FIFO相关出错信息:
EACCES (无存取权限)
EEXIST
(指定文件不存在)
ENAMETOOLONG (路径名太长)
ENOENT
(包含的目录不存在)
ENOSPC
(文件系统剩余空间不足)
ENOTDIR (文件枯井无效)
EROFS
(指定的文件存在于只读文件系统中)
fifo_read.c文件内容如下:
#include
#include
#include
#include
#define FIFO
“/tmp/myfifo”
main(int argc, char
**argv)
{
char
buf_r[100];
int
fd;
int
nread;
if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
printf(“cannot create
fifoserver\n”);
printf(“Preparing for reading
bytes…\n”);
memset(buf_r, 0,
sizeof(buf_r);
fd=open(FIFO,
O_RDONLY|O_NONBLOCK,0);
if(fd==-1)
{
perror(“open”);
exit(1);
}
while(1)
{
memset(buf_r,0,sizeof(buf_r));
if((nread=read(fd,buf_r,100))==-1){
if(errno==EAGAIN)
printf(“no
data yet\n”);
}
printf(“read
%s from FIFO\n”,buf_r);
sleep(1);
}
pause();
unlink(FIFO);
}
fifo_write.c文件内容如下:
#include
#include
#include
#include
#include
#include
#define FIFO_SERVER
“/tmp/myfifo”
main(int argc, char
**argv)
{
int
fd;
char w_buf[100];
nt
nread;
if(fd==-1)
if(error==ENXIO)
printf(“open
error;no reading process\n”
fd=open(FIFO_SERVER,
O_WRONLY|O_NONBLOCK,0);
if(argc==1)
print(“please
send something\n”)
strcpy(w_buf,
argv[1]);
if((nwrite==write(fd,w_buf,100))==-1)
{
if(errno==EAGAIN)
printf(“The FIFO has not been read
yet. Please try later\n”);
}
else
{
printf(“write
%s to the FIFO\n”, w_buf);
}
gcc –o fifo_read
fifo_read.c
gcc –o fifo_write
fifo_write.c
运行结果:
读管道:
./fifo_read
Preparing for reading
bytes…
read from FIFO
read from FIFO
read from FIFO
read from FIFO
read from FIFO
read from FIFO
写管道:
./fifo_write
ccccccccccc
write ccccccccccc to the
FIFO
读管道:
read from FIFO
read from FIFO
read from FIFO
read from FIFO
read ccccccccccc from
FIFO
read from FIFO
read from FIFO
read from FIFO
进程间通信___命名管道(FIFO)的更多相关文章
- 进程间通信:命名管道FIFO(2)
一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见 ...
- 进程间通信系列 之 命名管道FIFO及其应用实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- Linux学习笔记25——命名管道(FIFO)
1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...
- Linux系统编程——进程间通信:命名管道(FIFO)
命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...
- 《Linux 进程间通信》命名管道:FIFO
命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename 程序中创建命名管道: #include <sys/types.h> #incl ...
- 命名管道FIFO
首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了. 一直在理解进程间通信的问题.发现上次忽略了一个问题 ...
- Linux进程间通信——使用命名管道
在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程 ...
- 命名管道FIFO和mkfifo函数
进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...
随机推荐
- Flask的配置文件
Flask的配置文件 与 session 配置文件 flask中的配置文件是一个flask.config.Config对象(继承字典) 默认配置为: { 'DEBUG': get_debug_flag ...
- Android的方法和属性(2)
1.RadioButton(单选按钮) 嵌入到RsdioGroup中实现单选效果 android:checkedButton="radio的id值" int getCheckedR ...
- css选择器的特殊性值
今天从前端那拿来写好的页面,就开始动工,首先,照旧处理导航栏高亮的问题, 说到处理高亮的问题,不同的人会有不同的方法,比如: //类名为nav的元素下的第n个a元素 .nav a:nth-of-typ ...
- RPi 2B QEMU 模拟树莓派
/******************************************************************************** * RPi 2B QEMU 模拟树莓 ...
- Oracle新用户以及授权的若干问题
Database 实验4 问题: 授权语句 grant create table to user_name; 收回授权语句 revoke create table from user_name; 注意 ...
- 深度学习实战-----0001(移植反向传播Python to c++)
1. https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/ 老外教程 2. https://github. ...
- Microsoft Office 2013 (64位) 免费完整版(安装 + 激活)
Microsoft Office 2013(Office 15)是微软的新一代Office办公软件,全面采用Metro界面.Microsoft Office 2013官方下载(Office2013专业 ...
- LeetCode Next Closest Time
原题链接在这里:https://leetcode.com/problems/next-closest-time/description/ 题目: Given a time represented in ...
- fn project 试用之后的几个问题
今天试用fnproject 之后自己有些思考,后面继续解决 1. 目前测试是强依赖 dockerhub 的,实际可能不是很方便 2. 如何与k8s .mesos.docker swarm 集成 ...
- vscode: Visual Studio Code 常用快捷键【轉】
主命令框 F1 或 Ctrl+Shift+P: 打开命令面板.在打开的输入框内,可以输入任何命令,例如: 按一下 Backspace 会进入到 Ctrl+P 模式 在 Ctrl+P 下输入 > ...