进程间通信的几种方式

   进程间通信方式大概有 管道通信(又分为匿名管道,命名管道,高级管道),信号,消息队列,共享内存,信号量,套接字

(注意区分信号量和信号,不是同一概念)其中信号是这些方式中唯一的异步通信机制,而套接字可以在不同主机之间通信。

匿名管道是一个未命名的,单向管道,通过父进程和一个子进程之间传输数据。只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。常用的比如Linux命令。

  命名管道是进程间单向或双向管道,建立时指定一个名字,任何进程都可以通过该名字打开管道的另一端,可跨网络通信。

高级管道是将一个程序在另一个进程中打开,作为它的子进程,从而实现管道通信。

信号(signal):其实是软中断信号的简称。用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求是一样的。

信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达。

  收到信号的进程对各种信号有不同的处理方法,主要是三类:

  1.类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。

  2.忽略某个信号,对该信号不做任何处理。

  3.对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是让进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立的接收含有不同类型的数据结构。可以通过发送消息来避免命名管道的同步和阻塞问题。

但是消息队列和命名管道一样,每个数据块都有一个最大长度的限制。

  共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。

进程可以将同一段共享内存连接到他们自己的地址空间中,所有进程都可以访问共享内存中的地址。

  信号量:为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。

临界区域是指执行数据更新的代码需要独占式的执行。而信号量就可以提供这样的一种访问机制。让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来协调对共享资源访问的。

  套接字:这种通信机制使得客户端/服务器的开发工作既可以在本地单机上进行,也可以跨网络进行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值