进程间通信(pipe、fifo、mmap)

1、pipe

本质:

  • 匿名管道
  • 内核缓冲区
  • 伪文件(伪文件和操作文件类似)

创建方式:

#include <unistd.h>

int pipe(int fd[2]);
  • fd[0] 表示读端
  • fd[1] 表示写端

返回值:

  成功返回0,失败返回-1

特点:

  • 有读端和写端,对应两个文件描述符,数据从写端流入,读端流出
  • 操作管道的进程挂掉后管道自动释放
  • 管道默认是阻塞

管道原理:

  • 实现方式:环形队列 (先进先出)
  • 缓冲区大小:4k (大小会根据实际情况做适当调整) (ulimit -a)

管道的局限:

  • 管道中的数据只能读取一次,不能重复读取
  • 半双工工作模式

使用场景

  • 有血缘关系的进程间通信

注意事项:

  • 在一个进程里操作同一个管道时,读时关闭写端,写时关闭读端(避免自己写,自己读数据)

2、fifo

本质:

  • 有名管道(在磁盘上有一个管道文件)
  • 伪文件(大小永远为0)
  • 在内核有对应的缓冲区

创建方式:

  • 直接用命令创建在磁盘上:mkfifo name
  • 在程序中创建:
#include <sys/types.h>
#include <sys/stat.h>

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

参数说明:

  • pathname:文件名
  • mode:管道文件的权限(注:实际权限是 mode & ~umask)

返回值:

  • 成功返回0, 失败返回-1

使用场景

  • 用于没有血缘关系的进程间通信

操作方式:

  • 用IO函数操作(open/close)、(read/write

进程间通信:

  • a.c (read -> fifo) 如果管道没有东西,会处于阻塞状态
  • b.c (write -> fifo) 如果管道内有东西没有读取完,会处于阻塞状态

猜你喜欢

转载自www.cnblogs.com/SingleJourney/p/9022340.html