(1)消息队列
- 匿名管道是跟随进程的,消息队列是跟随内核的,也就是说进程结束之后,匿名管道就死了,但是消息队列还会存在(除非显示调用函数销毁)。
- 管道是文件,存放在磁盘上,访问速度慢,消息队列是数据结构,存放在内存,访问速度快。
- 管道是数据流式存取,消息队列是数据块式存取。
(2)匿名管道
-
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。
-
只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
-
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
-
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
-
当缓冲区读空或者写满时,有一定的规则控制相应的读进程或者写进程进入等待队列,当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时,就唤醒等待队列中的进程继续读写。
(3)有名管道
有名管道虽然和普通文件一样具有磁盘存放路径、文件权限和其他属性;但是,它和普通文件又有区别,有名管道并没有在磁盘中存放真正的信息,它存储的通信信息在内存中,
(4)信号量
(5)套接字
AF_UNIX也有面向流传输和面向数据包传输两种方式,类似于TCP和UDP
(6)信号
(7)共享内存
共享内存有三种方式:mmap、posix共享内存,system V(XSI)三种。
posix共享内存:先使用shm_open()函数创造/dev/shm路径下的文件,再使用mmap将这个共享文件映射到用户进程空间便可以直接访问。