当前位置:文档之家› linuxC-进程间通信-有名管道fifo

linuxC-进程间通信-有名管道fifo

进程间通信—有名管道
◦fifo简介
无名管道,它只能用于具有亲缘关系的进程之间,这就大大地限制了管道的使用。

有名管道的出现突破了这种限制,它可以使互不相关的两个进程实现彼此通信。

该管道可以通过路径名来指出,并且在文件系统中是可见的。

在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。

FIFO 是严格地遵循先进先出规则的,对管道及 FIFO 的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如 lseek()等文件定位操作。

有名管道的创建可以使用函数 mkfifo(),该函数类似文件中的 open()操作,可以指定管道的路径和打开的模式。

进程通过文件IO来操作有名管道,有名管道创建之后,任何进程都可以访问。

◦fifo打开方式
在创建管道成功之后,就可以使用open()、read()和write()这些函数了。

与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置
O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY。

1.如果打开的时候是,是以只读方式(O_RDONLY)打开的,则open返回
的文件描述符fd是只读的。

2.如果打开的时候是,是以只写方式(O_WRONLY)打开的,则open返回的
文件描述符fd是只写的
3.如果打开的时候是,是以读写方式(O_RDWR)打开的,则open返回的文
件描述符fd是读写的
◦fifo读写特性
由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以
在open()函数中设定为O_NONBLOCK。

下面分别对阻塞打开和非阻塞打开的读写进行讨论。

(1)对于读进程。

•若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。

•若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。

即如果FIFO内没有数据,则读函数将立刻返回0。

(2)对于写进程。

•若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。

•若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。

◦fifo创建函数
mkfifo()函数格式
表8.4列出了mkfifo()函数的语法要点。

函数语法要点
表8.4mkfifo()
FIFO
相关的出错信息
◦fifo创建终端命令
用户还可以在命令行使用“mknod 管道名 p”来创建有名管道。

还可以运用mkfifo 有名管道名 创建文件
命令mkfifo和有名管道函数创建一样。

◦典型的fifo模型
C/S模型
◦fifo示例
第一个文件create_fifo.c主要是创建一个管道文件,也可以用mkfifo命令来创建一个管道。

管道创建好之后可以在文件系统中看到,同时也可以看到文件的大小为0。

create_fifo.c
创建好之后的运行效果。

下面的程序要运用到否创建的这个管道文件。

read_fifo.c这是读取管道,从管道中读取文件。

write_fifo.c
程序的运行的结果如下:。

相关主题