进程间通信___命名管道(FIFO)

原创 2013年12月02日 09:09:56

命名管道(FIFO)

基本概念

命名管道和一般的管道基本相同,但也有一些显著的不同:

    命名管道是在文件系统中作为一个特殊的设备文件而存在的。

    不同祖先的进程之间可以通过管道共享数据。

    当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。

管道只能由相关进程使用,它们共同的祖先进程创建了管道。但是,通过FIFO,不相关的进程也能交换数据。

 

命名管道创建和操作::

#include

#include

int mkfifo(const char *pathname, mode_t mode);

返回:若成功则为0,若出错则为-1

一旦已经用mkfifo创建了一个FIFO,就可用open打开它。确实,一般的文件I/O函数(closereadwriteunlink)都可用于FIFO

当打开一个FIFO时,非阻塞标志(O_NONBLOCK)产生下列影响:

(1)     在一般情况中(没有说明O_NONBLOCK),只读打开要阻塞到某个其他进程为写打开此FIFO。类似,为写而打开一个FIFO要阻塞到某个其他进程为读而打开它。

(2)     如果指定了O_NONBLOCK,则只读打开立即返回,但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errnoENXIO

类似于管道,若写一个尚无进程为读而打开的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


版权声明:本文为博主原创文章,未经博主允许不得转载。

【Linux】进程间通信-命名管道FIFO

命名管道概述 如果我们要在不相关的进程间交换数据,那么使用FIFO文件将会十分方便。 FIFO文件通常也称为命名管道(named pipe)。命名管道是一种特殊类型的文件,它在文件系统中以文件...
  • xiajun07061225
  • xiajun07061225
  • 2013年01月06日 15:41
  • 14823

进程间通信-管道(PIPE)和有名管道(FIFO)

前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立。进程与进程间不能像线程间通过全局变量通信。 如果想进程间通信,就需要其他机制。          常用的进程间通信方式有这...
  • w616589292
  • w616589292
  • 2016年03月22日 18:52
  • 2182

【Linux进程间通信】 - 命名管道FIFO

在前面一篇文章中【Linux进程间通信】 - 匿名管道中,我们介绍了Linux/Unix系统中最古老的一种进程间通信方式 – 匿名管道。此外,我们也讲解了匿名管道的几个局限性,特别是匿名管道只能用...
  • Xiejingfa
  • Xiejingfa
  • 2016年03月08日 16:55
  • 1594

Linux进程间通信(IPC)之二——命名管道(FIFO)

 1 命名管道(FIFO)      经过前文《Linux进程间通信(IPC)之一——管道》介绍管道,但是管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管...
  • orzlzro
  • orzlzro
  • 2011年04月29日 21:19
  • 627

Linux进程间通信-FIFO(命名管道)

与无名管道不同,FIFO可用于无关系的进程之间 1.管道读写端操作,如果读写端有一方读或写没打开,则另一端阻塞直到打开(非阻塞情况下会成功打开) 2.如果管道buf满了没有剩余空间,则写端会阻塞直...
  • Sandeldeng
  • Sandeldeng
  • 2016年10月17日 09:45
  • 274

不相关进程间通信--命名管道(FIFO文件)

命名管道是一种特殊类型的文件(FIFO),可以完成两个不相关之间的通信。它在文件系统中以文件名的方式存在,但行为却和一般的管道相似。 一.创建FIFO 在程序中,可以使用两个不同的函数调用...
  • sever2012
  • sever2012
  • 2011年12月26日 16:40
  • 1759

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

命名管道的概述 无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看《无名管道》)。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。 ...
  • zy986718042
  • zy986718042
  • 2017年07月02日 22:22
  • 133

【Linux】进程间通信-命名管道FIFO

命名管道概述 如果我们要在不相关的进程间交换数据,那么使用FIFO文件将会十分方便。 FIFO文件通常也称为命名管道(named pipe)。命名管道是一种特殊类型的文件,它在文件系统...
  • zzwdkxx
  • zzwdkxx
  • 2016年11月25日 18:00
  • 167

进程间通信-命名管道FIFO

命名管道概述 如果我们要在不相关的进程间交换数据,那么使用FIFO文件将会十分方便。 FIFO文件通常也称为命名管道(named pipe)。命名管道是一种特殊类型的文件,它在文件系统中以...
  • u012349696
  • u012349696
  • 2016年04月12日 14:48
  • 321

进程间通信(5) - 命名管道(FIFO)

1. 前言 本篇文章的所有例子,基于RHEL6.5平台。前一篇文章介绍了匿名管道。点此链接。 2.介绍 管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(name...
  • shltsh
  • shltsh
  • 2015年06月17日 00:26
  • 2253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程间通信___命名管道(FIFO)
举报原因:
原因补充:

(最多只允许输入30个字)