有名管道(FIFO)
有名管道是一个设备文件.
FIFO不同于管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存储于文件系统中.即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信.
FIFO(First In First Out)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出.
有名管道的创建与读写
1.在shell下交互地建立一个有名管道
shell下可以使用mknod或mkfifo命令.
如:使用mknod命令创建一个有名管道
mknod namedpipe
2.在程序中使用系统函数建立有名管道
创建有名管道的系统函数
1.mknod
2.mkfifo
两个函数均定义在头文件sys/stat.h.调用成功返回0,失败返回-1.
函数原型:
#include <sys/type.h>
#include <sys/stat.h>
int mknod(const char *path, mode_t mod, dev_t dev);
int mkfifo(const char *path, mode_t mod);
path : 创建的有名管道的全路径名
mod : 创建的有名管道的模式,指明其存取权限
dev : 设备值,该值取决于文件创建的种类.只在创建设备文件时会用到.
使用mknod函数创建一个有名管道
umask(0);
if (mknod ("/tmp/fifo",S_IFIFO | 0666, 0) == -1)
{
perror("mknod error!");
exit(1);
}
使用mkfifo函数创建
umask(0);
if (mkfifo ("/tmp/fifo",S_IFIFO | 0666) == -1)
{
perror("mkf error!");
exit(1);
}
使用有名管道时,必须先调用open()将其打开,因为有名管道是一个存在于硬盘上的文件.
调用open()打开有名管道的进程有可能会被阻塞.
如果同时用读写方式(O_RDWR)打开,则一定不会导致阻塞.
如果以只读方式(O_RDONLY)打开,则调用open()函数的进程将会被阻塞直到有写方打开管道.
如果以只写方式(O_WRONLY)打开,也会阻塞直到有读方打开管道.