进程之间的通信方式

进程通信

  1. 数据传输
  2. 资源共享
  3. 通知事件
  4. 进程控制

分类

1. 管道

在这里插入图片描述
| 是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。如果两个进程要通信的话,可以使用这种管道进行通信,因为 | 没有名字,所以成为匿名管道,匿名管道一般用于有父子进程关系的进程中 。并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要通信的话,需要创建两个管道。当然也可以给管道命名,以下就命名一个名字为test的管道。命名管道不相关的进程也能通信。
在这里插入图片描述
然后用一个进程给这个管道写入数据,可以发现如果这个数据没有被读出的话,命令就一直停在那里。只有另外一个进程把try里的数据读走这条命令才会结束。
在这里插入图片描述
用另一个进程来读取try中的数据。当读取完以后,上一个命令也结束了。
在这里插入图片描述总结:
管道的通知机制类似于缓存,把一个进程的数据放在某个缓存区域,然后等另外一个进程去拿。管道通过调用pipe函数创建的。
(1)管道是单向传输的,即它是半双工的,这种通信方式不适合频繁通信的进程。
(2)匿名管道只能在具有公共祖先的两个进程中使用。命名管道可以在两个不相关的进程之间使用。
(3)但是它比较简单,能够保证我们的数据已经被其他进程拿走了。

2. 消息队列

如果想把进程的数据放在某个内存之后不用其他进程来取就让进程返回的话,可以使用消息队列,假如A要给B发送消息,只需要把消息放在消息队列中就可以了,B在需要的时候再去对应的消息队列中取出来。
总结:
(1)这种方式如果进程A给进程B发送的数据占的内存比较大,并且通信频繁的话,就不太适合了,因为此时发送数据(拷贝)需要花很长时间读内存。
(2)msgget用于创建一个新队列或者是打开一个现有队列。

3. 共享内存

这种方法可以很好的解决拷贝所消耗的时间。系统加载一个进程的时候,分配给内存的并不是实际物理内存,而是虚拟内存空间。所以可以让两个进程各自拿出一块虚拟地址空间映射到相同的物理内存中,从而实现内存共享。

4. 信号量

内存共享会有多进程竞争内存的问题,为此,可以使用信号量。信号量本质上是一个计数器,用来实现进程之间的互斥与同步,比如信号量初始值是1,A进程来访问内存1时,我们把信号量的值设为0,当进程B来访问内存1时,发现信号量是0就知道有进程在访问,进程B就不会访问内存1了。
5. socket
以上4种都是多个进程在一个主机上通信,如果是不同主机的进程进行通信,就要用socket了。socket通信比较稳定。
【补充】
参考的是微信公众号 苦逼的码农 ,这上面真是干货多多,每天必读。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值