进程间通信方式有⼏种,他们之间的区别是什么?

  1. 管道

管道,通常指⽆名管道。

① 半双⼯的,具有固定的读端和写端;

② 只能⽤于具有亲属关系的进程之间的通信;

③ 可以看成是⼀种特殊的⽂件,对于它的读写也可以使⽤普通的read、write函数。但是它不是普通的⽂件,并不属于其他任何⽂件系统,只能⽤于内存中。

④ Int pipe(int fd[2]);当⼀个管道建⽴时,会创建两个⽂件⽂件描述符,要关闭管道只需将这两个⽂件描述符关闭即可。

  1. FiFO (有名管道)

① FIFO可以再⽆关的进程之间交换数据,与⽆名管道不同;

② FIFO有路径名与之相关联,它以⼀种特殊设备⽂件形式存在于⽂件系统中;

③ Int mkfifo(const char* pathname,mode_t mode);

  1. 消息队列

① 消息队列,是消息的连接表,存放在内核中。⼀个消息队列由⼀个标识符来标识;

② 消息队列是⾯向记录的,其中的消息具有特定的格式以及特定的优先级;

③ 消息队列独⽴于发送与接收进程。进程终⽌时,消息队列及其内容并不会被删除;

④ 消息队列可以实现消息的随机查询

  1. 信号量

① 信号量是⼀个计数器,信号量⽤于实现进程间的互斥与同步,⽽不是⽤于存储进程间通信数据;

② 信号量⽤于进程间同步,若要在进程间传递数据需要结合共享内存;

③ 信号量基于操作系统的PV操作,程序对信号量的操作都是原⼦操作

  1. 共享内存

① 共享内存,指两个或多个进程共享⼀个给定的存储区;

② 共享内存是最快的⼀种进程通信⽅式,因为进程是直接对内存进⾏存取;

③ 因为多个进程可以同时操作,所以需要进⾏同步;

④ 信号量+共享内存通常结合在⼀起使⽤。

Last updated