IPC

管道

管道,通常指无名管道

特点

  • 半双工,数据只能在一个方向上流动,具有固定的读端和写段
  • 只能用于具有亲缘关系的进程之间的通信(父子进程,兄弟进程)
  • 它可以看作一种特殊的文件,对于它的读写也可以使用普通的read,write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中

原型

#include <stdio.h>
int pipe(int fd[2]);  // 返回值:若成功返回0,失败返回-1;
img

单个进程中的管道几乎没有任何作用,所以,通常调用pipe的进程接着调用fork,这样就创建了父进程和子进程之间的IPC通道:

img

FIFO

FIFO,也称为命名管道,是一种文件类型

特点

  • FIFO可以在无关的进程之间交换数据,与无名管道不同
  • FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中

原型

#include <stdio.h>
int mkfifo(const char* pathname, mode_t mode);

消息队列

消息队列,是消息的链接表,存放在内核中,一个消息队列由一个标识符(即队列ID)来标识

特点

  • 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
  • 消息队列独立于发送和接受进程,进程终止时,消息队列以及其内容不会被删除
  • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取

原型

#include <sys/msg.h>
int msgget(key_t key, int flag);
int msgsnd(int msqid, const void* ptr, size_t size, int flag);
int msgrcv(int msqid, void* ptr, size_t size, long type, int flag);
int msgctl(int msqid, int cmd, struct msqid_ds* buf);