Linux下进程通信 匿名管道pipe

2021-01-09  本文已影响0人  凯玲之恋

匿名管道(pipe):

匿名管道(pipe)是Linux支持的最初Unix IPC形式之一

匿名管道进行父子进程之间通信需要用到的函数:
int pipe(int fildes[2]);
一般都是指创建匿名管道,其中传出 int fildes[2] 参数是固定的;
fildes[0] 代表读端,fildes[1] 代表写端。
适用于有血缘关系的进程。
通常父子进程之间是不要使用 sleep() 函数的,因为管道默认就是堵塞的
虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间

20200329_165752.png
int flags = fcntl(fd[0], F_GETFL);
flags |= O_NONBLOCK;
fcntl(fd[0], F_SETFL, flags);

2 匿名管道(pipe)

2.1 什么是匿名管道?

匿名管道(pipe)是Linux支持的最初Unix IPC形式之一,具有以下特点:

2.2 匿名管道的实现机制

5713484-cfdbad83904e2279.png
设想
通过pipe函数创建匿名管道之后。用fork函数进行子进程的创建。创建之后,在那一瞬间,父进程和子进程具有相同的文件描述符表。因此,在子进程中也存在一个文件描述符指向管道缓冲区。

关闭父进程的写端,关闭子进程的读端。就形成了下面的这个通信图。

20200708165132429.png

2.3 匿名管道实现细节

5713484-7d91e2fab54d6c95.png

2.4 关于匿名管道的读写

  • 内存中有足够的空间可以容纳所有要写入的数据。
  • 内存没有被读程序锁定。
  • VFS
    VFS(virtual File System/虚拟文件系统):是Linux文件系统对外的接口。任何要使用文件系统的程序都必须经由这层接口来使用它。它是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关系底层的存储介质和文件系统类型就可以工作的粘合层。在Linux中,VFS采用的是面向对象的编程方法。

参考

Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)
进程之间通信之匿名管道(PIPE)和有名管道(FIFO)

上一篇 下一篇

猜你喜欢

热点阅读