linux 中进程间6种通信方式

  1. 管道
  2. socket
  3. 共享内存
  4. 信号
  5. 信号量
  6. 消息队列

1. 管道(pipe)

管道的发明人是道格拉斯·麦克罗伊,在Linux上的管道分两种类型:

  1. 无名管道 PIPE(可用于父子间进程通信)
  2. 有名管道 FIFO(可用于任意两个进程间通信)

无名、有名管道都是单向的,是先进先出的,联系一个进程的输出和另一个进程的输入。写入在管道的尾部,读出在管道的头部。管道只能传送无格式的字节流。

2. socket

socket,即套接字是一种通信机制。建立 socket 使得两个进程间通信可以是在单机内也可以是跨网络的。

3. 共享内存

在物理内存中申请一块出来,供多个进程使用。使用方便,是共享数据最快的方式。

4. 信号(signal)

信号可用于进程间进行异步事件通知。比如在按下某个键、硬件异常(如除数为0,无效的存储)、进程或用户 kill 函数等从而触发一个事件并且发送一个信号给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。linux 下常见的信号有 SIGKILL、SIGSTOP、SIGALRM 等等。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

5. 信号量

主要用于保护临界资源(只能同时被一个进程使用,类似于排斥锁),进程可以根据它判定是否能够访问某些共享资源,除了用于访问控制外,还可用于进程同步。实质是一个数字,默认是1。

6. 消息队列

unix 早期通信机制一直用的信号能够传送的信息量有限,管道则只能传送无格式的字节流。而消息队列就是为了克服这些缺点。消息队列实质是一个链表。可以把消息看做一个记录,具有特定的格式。消息消费后就会被删除。主要有两种消息队列:

  1. POSIX 消息队列
  2. 系统 V 消息队列

方式2被广泛应用。系统 V 消息队列是随内核持续的,随人工删除、重启机器则会被删除,要求每个消息队列都在系统范围内对应唯一的键值。

添加新评论