进程间通信的几种方式

Linux下:

1.管道: 管道通信的方式就是共享文件通信的方式,在连接的两个进程之间建立一个共享文件,也称pipe文件,可以传输大量数据。它与一般相比有些特殊:

1.专门用于通信 2.只能单向传送 3.在读写操作中,进程之间需要的同步和互斥是由系统自动执行的。

分为无名管道: 临时无名文件。在物理上由文件系统的高速缓冲区构成,很少启动外部设备 。因为是临时的,所以文件被关系后,文件就不存在了。用户看不到存在,不需要系统调用open打开,建立就可以直接使用。只能在祖先进程,子孙进程,这种有家族关系的管道才能存在。

有名管道:在磁盘上会有对应的目录,是真实文件。可实现无家族关系进程的通信。但双方依然是单向的。

 

2.共享内存的方式

在内存中划出一块内存区作为共享数据区,称之为共享内存区。要通信的双方将自己的虚拟地址空间映射到内存分区上。

共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。因为多个进程可以同时操作,所以需要进行同步。

 

3.消息队列

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

1、特点
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。

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

消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

函数msgrcv在读取消息队列时,type参数有下面几种情况:

  • type == 0,返回队列中的第一个消息;
  • type > 0,返回队列中消息类型为 type 的第一个消息;
  • type < 0,返回队列中消息类型值小于或等于 type 绝对值的消息,如果有多个,则取类型值最小的消息。

可以看出,type值非 0 时用于以非先进先出次序读消息。也可以把 type 看做优先级的权值。(其他的参数解释,请自行Google之)

参考链接:https://www.cnblogs.com/zgq0/p/8780893.html

4.信号量

信号量(semaphore)是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

1、特点

  1. 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

  2. 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。

  3. 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。

  4. 支持信号量组。

2、原型

最简单的信号量是只能取 0 和 1 的变量,这也是信号量最常见的一种形式,叫做二值信号量(Binary Semaphore)。而可以取多个正整数的信号量被称为通用信号量。

Linux 下的信号量函数都是在通用的信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作。

5.套接字( socket ) :

  • 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

 

参考:

https://www.cnblogs.com/liugh-wait/p/8533003.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值