命名管道(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)的更多相关文章

  1. 进程间通信:命名管道FIFO(2)

    一.命名管道 如果我们想在不相关的进程之间交换数据,可以用FIFO文件来完成这项工作,它通常也被称为命名管道.命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和我们已经见 ...

  2. 进程间通信系列 之 命名管道FIFO及其应用实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  3. Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

    整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...

  4. Linux学习笔记25——命名管道(FIFO)

    1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...

  5. Linux系统编程——进程间通信:命名管道(FIFO)

    命名管道的概述 无名管道,因为没有名字,仅仅能用于亲缘关系的进程间通信(很多其它详情.请看<无名管道>).为了克服这个缺点.提出了命名管道(FIFO).也叫有名管道.FIFO 文件. 命名 ...

  6. 《Linux 进程间通信》命名管道:FIFO

    命名管道的主要用途:不相关的进程之间交换数据. 命令行上创建命名管道: $ mkfifo filename  程序中创建命名管道: #include <sys/types.h> #incl ...

  7. 命名管道FIFO

    首先我得检讨一下自己,这几天有些颓呀,打不起精神,板子出了点问题,果真自学还是很困难呀,硬件方面难解决呀,理想与现实还是很有差距的,伤透了,凌乱了. 一直在理解进程间通信的问题.发现上次忽略了一个问题 ...

  8. Linux进程间通信——使用命名管道

    在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程 ...

  9. 命名管道FIFO和mkfifo函数

    进程间通信必须通过内核提供的通道,而且必须有一种办法在进程中标识内核提供的某个通道,前面讲过的匿名管道是用打开的文件描述符来标识的.如果要互相通信的几个进程没有从公共祖先那里继承文件描述符,它们怎么通 ...

随机推荐

  1. react-router-dom: 重定向默认路由

    <appLayout> <Switch> <Route path='/' exact render={()=> ( <Redirect to={this.ge ...

  2. ffmpeg推送RTSP直播流到EasyDarwin报错问题的修复

    在之前的博客<ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播>中,我们介绍了如何采用ffmpeg进行RTSP推送,实现EasyDarwin直播分发的功能,近期 ...

  3. 作为一名Java开发工程师需要掌握的专业技能

    在学习Java编程完之后,学员们面临的就是就业问题.作为一名Java开发工程师,企业在招聘的时候,也是有一定的标准的. 为了帮助大家更好的找到适合自己的工作,在这里分享了作为一名Java开发工程师需要 ...

  4. 列表(增删改查)元组tupe

    增加:有三种,append:在后面添加.Insert按照索引添加,expend:迭代着添加.#append li = ['lishi','alex','lili'] li.append(') prin ...

  5. mysql基础认识1

    一.配置文件 服务端和客户端的字符编码不一样时,可能会导致乱码显示等情况,为了统一两端的字符编码,可以通过配置文件进行实现,当然譬如登录账户等信息也可以进行配置,在启动mysql服务端时会自动读取配置 ...

  6. eclipse javaw.exe in your current path问题

    问题: 第一次运行eclipse的时候,可能会提醒找不到javaw.exe ******等的问题 很坑的! 解决方案: 无法启动Eclipe,因找不到javaw.exe 还是环境变量的问题!!! 注意 ...

  7. 【后端】Python学习笔记

    主要学习材料:<笨办法学习Python> ,(虫师的博客) 后面根据虫师的Python教程再对Pyhon进行了一次重新学习 ================================ ...

  8. (转)Android代码混淆-添加了Gson遇到的问题

    折腾了好久.....郁闷 -_- 1.首先,project.properties里的配置文件变了,之前的项目一直都是在project.properties这个文件中添加一行proguard.confi ...

  9. ReactJS开发环境搭建与相关工具介绍

    现在Web开发的技术几年前相比可谓变化之大.各种各样的框架,各种各样的工具,让Web开发效率更高,开发出来的效果更好.同时带来的是开发环境的复杂度相比以前是成倍的增加.ReatJS框架是现在比较流行的 ...

  10. LaunchImage添加以及设置无效处理

    1.添加LaunchImage 2.添加所需要图片即可,出现un..可以删除,警告也随之而去,并删除LauchImage Assets之后重新添加 3.确定设置是否一样 4.发现启动后加载不了启动图, ...