Linux进程间通信方式一:有名管道FIFO

有名管道

我们经常把FIFO称为有名管道(命名管道)。使用它可以实现两个不相干的进程之间的通信。它虽然被称之为文件,但是管道文件在磁盘上只有一个inode结点,这个ionde结点指向的是内存中的一块区域,当A进程创建并使用有名管道时,直接把数据写入内存中,而B进程也是直接去内存中读取数据。

FIFO是一种文件类型,创建FIFO类似于创建文件,而FIFO的路径名也的确存在与文件系统中。在linux操作系统上,我们可以使用mkfifo命令来创建一个FIFO有名管道文件。并使用它进行两个不相干进程间的通信。一旦已经用mkfifo创建了一个管道文件,那么一般文件的I/O函数都可以用于该有名管道文件(open,close,read,write,等)

可以看到图中的FIFO文件,是我们调用mkfifo命令创建出来的。

我们使用ll命令看一下它的类型和权限

从图中可以看出,FIFO的文件类型标志位为p,在Linux系统中,p代表管道文件类型,权限方面,组用户和属主拥有读写权限,其他用户拥有只读权限,而这三种用户都没有执行权限。

创建好了一个有名管道之后,我们就可以利用他来进行进程间通信了,这里举一个简单的例子,a进程往FIFO里面写内容,b进程从FIFO里面读内容

a.c如下:

扫描二维码关注公众号,回复: 3731175 查看本文章

b.c如下:

用户在a进程中输入一个字符串,b进程将其打印出来:运行结果如下:

可以看到,在a进程执行了之后,但是还没有执行b进程时,a进程不是直接结束,而是阻塞住了,这和我们有名管道运行的机制有关,

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

  1. 在一般情况下(没有指定O_NONBLOK),只读方式的调用open函数会阻塞到莫格其他进程为写而打开该FIFO,也就是说,当我们进程a运行时,没有同时运行b进程,a进程就会阻塞,直到b进程以写的方式调用open函数打开这个FIFO,这时我们才能往这个管道文件里面写入数据。
  2. 如果指定了O_NONBLOCK,则只读open会立即返回,不会阻塞,而要是没有进程已经为读打开一个FIFO,那么只写open将出错返回-1

只有当a,b进程同时运行才会正常运行:

猜你喜欢

转载自blog.csdn.net/Mr_H9527/article/details/83245337