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

2018-12-17 10:46:27来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

命名管道的主要用途:不相关的进程之间交换数据。

 

命令行上创建命名管道:

$ mkfifo filename

 

 程序中创建命名管道:

#include <sys/types.h>
#include <sys/stat.h>

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

备注:#include <sys/types.h>是Unix/Linux系统的基本系统数据类型的头文件,含有Size_t,time_t,pid_t等类型。

   #include<sys/stat.h>是Unix/Linux系统定义文件状态所在的伪标准头文件。

 

例程:创建一个FIFO命名管道

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    int res;

    res = mkfifo("./FIFO", 0777);
    if(res == 0)
    {
        printf("FIFO created\n");
    }

    exit(EXIT_SUCCESS);

}

备注:文件权限方面的知识有点模糊,需要回顾。

 

$ ls -lF(F选项会在显示目录条目时,在目录后加一个符号“/”表示文件夹 “|”表示管道)
prwxr-xr-x 1 root root 0 12月 17 17:02 FIFO|

创建出来的FIFO管道如上图所示,其中第一个字符p表示这是一个管道,其中最后一个|符号是由ls命令的-F选项所添加,也表示它是一个管道。

FIFO是以命名文件的形式存在,而不是打开的文件描述符,所以在对它进行读写操作之前必须先打开它。而且,对于FIFO来说,传递给open函数的第一个参数一定是一个FIFO的路径名,而不是一个文件名。

 

使用open打开FIFO文件

1.FIFO命名管道不能以O_RDWR的模式打开,会产生二义性。(通常使用FIFO只是为了单向传递数据)

2.如果确定需要程序之间双向传递数据。①最好使用一对FIFO或者管道,一个方向使用一个②采用先关闭再重新打开FIFO的方法来明确地改变数据流的去向(不常用)。

3.打开FIFO文件和打开普通文件的另一点区别是:对open_flag(open的第二个参数)的O_NONBLOCK的用法。

  • open(const char *path, O_RDONLY);

在这种情况下,open调用将阻塞,除非有一个进程以写方式打开一个FIFO,否则它是不会返回。

  • open(const char *path, O_RDONLY | O_NONBLOCK);

即使没有其他进程以写方式打开FIFO,open调用也会成功并且立即返回

  • open(const char *path, WRONLY);

在这种情况下,open调用将阻塞,直到有一个进程以读方式打开进程。

  • open(const char *path,  WRONLY | O_NONBLOCK);

这个函数调用总是立刻返回,但如果没有进程以读方式打开FIFO文件,open调用将返回一个错误-1并且FIFO也不会被打开。如果确实有一个进程以读方式打开FIFO文件,那么我们就我再可以通过它返回的文件描述符对这个FIFO文件进行写操作。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:kafka查看topic

下一篇:SSH批量分发管理