进程之间的6种通信方式详解

本文详细介绍了进程间通信的六种方式:管道(匿名和命名)、消息队列、共享内存、信号量、信号和Socket。管道是单向数据流,适合简单通信;消息队列提供了消息的存取,避免了数据拷贝,但有大小限制;共享内存直接共享数据,高效但需处理并发访问问题;信号量用于资源互斥与同步;信号是异步通信,处理异常情况;Socket则支持跨网络通信。
摘要由CSDN通过智能技术生成
一.进程通信之-管道

  • 管道传输的数据是单向的, 如果想相互通信,需要创建两个管道。
  • 管道传输的数据是无格式的流且大小受限。
  • 管道这种通信方式效率低,不适合进程间频繁地交换数据。当然,它的好处,自然就是简单,同时也我们很容易得知管道里的数据已经被另一个进程读取了。
  • 对于匿名管道,它的通信范围是存在父子关系的进程。
  • 对于命名管道(FIFO),它可以在不相关的进程间也能相互通信。
  • 不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。
二.进程通信之-消息队列

  • 消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。
  • 不足的地方有两点,一是通信不及时,二是附件也有大小限制
  • 消息队列不适合比较大数据的传输,因为在内核中每个消息体都有一个最大长度的限制,同时所有队列所包含的全部消息体的总长度也是有上限。在 Linux 内核中,会有两个宏定义 MSGMAXMSGMNB,它们以字节为单位,分别定义了一条消息的最大长度一个队列的最大长度
  • 消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时&#x
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值