进程间通信


1、管道和命名管道

管道的实质是一个内存缓冲区,管道的一端进程以顺序的方式把数据写入缓存,另一端则顺序地读出数据。

管道

  • 半双工,数据只能单向流动;
  • 管道是匿名的;
  • 只能用于有亲缘关系的进程之间;
  • 缓存是有限制的;
  • 数据先进先出
  • 传送的数据是无格式的,这要求进程间要事先约定好数据格式。

命名管道

命名管道克服了管道只能用于亲缘进程之间的缺点。只要可以访问该路径,就能通过命名管道进行通信。

2、信号

用于通知接收进程有某种事件发生。

  • 信号由某进程产生,并设置信号传递的对象,然后传递给操作系统;
  • 操作系统根据该对象的状态(是否阻塞),选择性地发送给接收者。如果接收者阻塞该信号,操作系统暂时保留该信号;如果接收者没有阻塞,操作系统传递该信号;
  • 目的进程接收到该信号之后,根据对此信号设置的预处理方式,暂时终止当前代码的执行、保留上下文、执行中断程序、执行完成之后再回到中断的位置。

3、消息队列

  • 是一个链表,具有特定的格式,存放在内存中;
  • 允许一个或多个进程写入消息;
  • 消息可以实现随机查询。

4、共享内存

多个进程可以访问同一块内存空间。

5、信号量

信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在进程间同步。

  • 创建一个信号量:调用者指定初始值,对于二值信号量而言,可以是1或0;
  • 等待一个信号量:测试信号量的值,如果小于0就阻塞(P 操作)。
  • 挂出一个信号量:将操作了的值加1(V 操作)。

6、套接字

套接字是一种通信机制,凭借这种方式,客户/服务器端既可以在本地进行,也可以跨网络进行。

套接字由3个属性确定:域、端口号、协议类型。