进程间通信2

时间:2020-12-19 19:03:05

有名管道(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)打开,也会阻塞直到有读方打开管道.