进程间通信方式有⼏种,他们之间的区别是什么?
管道
管道,通常指⽆名管道。
① 半双⼯的,具有固定的读端和写端;
② 只能⽤于具有亲属关系的进程之间的通信;
③ 可以看成是⼀种特殊的⽂件,对于它的读写也可以使⽤普通的read、write函数。但是它不是普通的⽂件,并不属于其他任何⽂件系统,只能⽤于内存中。
④ Int pipe(int fd[2]);当⼀个管道建⽴时,会创建两个⽂件⽂件描述符,要关闭管道只需将这两个⽂件描述符关闭即可。
FiFO (有名管道)
① FIFO可以再⽆关的进程之间交换数据,与⽆名管道不同;
② FIFO有路径名与之相关联,它以⼀种特殊设备⽂件形式存在于⽂件系统中;
③ Int mkfifo(const char* pathname,mode_t mode);
消息队列
① 消息队列,是消息的连接表,存放在内核中。⼀个消息队列由⼀个标识符来标识;
② 消息队列是⾯向记录的,其中的消息具有特定的格式以及特定的优先级;
③ 消息队列独⽴于发送与接收进程。进程终⽌时,消息队列及其内容并不会被删除;
④ 消息队列可以实现消息的随机查询
信号量
① 信号量是⼀个计数器,信号量⽤于实现进程间的互斥与同步,⽽不是⽤于存储进程间通信数据;
② 信号量⽤于进程间同步,若要在进程间传递数据需要结合共享内存;
③ 信号量基于操作系统的PV操作,程序对信号量的操作都是原⼦操作
共享内存
① 共享内存,指两个或多个进程共享⼀个给定的存储区;
② 共享内存是最快的⼀种进程通信⽅式,因为进程是直接对内存进⾏存取;
③ 因为多个进程可以同时操作,所以需要进⾏同步;
④ 信号量+共享内存通常结合在⼀起使⽤。
Last updated