进程间通信:
定义:
每个进程各自都有不同的用户地址空间,任何一个进程的全局变量在另一个进程中是无法看到的。因此进程间交换数据必须通过内核,需要在内核开辟缓冲区,进程A将数据从用户空间拷贝到内核缓冲区中,进程B再将数据从内核缓冲区拿走。内核提供的这种机制称为进程间的通信。
通信方式:
1.管道/匿名管道:
- 半双工的,数据只能向一个方向流动,双方通信时需要建立两个管道。
- 只能是有亲缘关系的进程之间使用。
- 一个进程A向管道中写内容时添加到管道缓冲区的末尾,进程B从缓冲区的头部读数据。
- “先进先出”
2.有名管道
- 为了克服匿名管道中只有亲缘关系的进程间通信,提出有名管道。
- 有名管道指提供了一个路径名与它相关联,只要某个进程可以访问路径,就能够通过有名管道相互通信。
3.信号
- linux系统中用于进程间通信的一种机制,信号可以在任何时候发给某一个进程,不需要知道这个进程的状态。
4.消息队列
- 消息队列是存放在内核中的消息链表,具有特定的格式,存放在内存中并由消息队列标识符标识。
- 消息队列允许一个或者多个进程向它写入或者读取消息。
- 消息队列可以实现消息的随机查询,不一定按照先进先出的次序读取,比如可以按照消息的类型读取。
5.共享内存
- 在内核中专门留了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就能够直接读写这块内存而不需要进行数据的拷贝,从而提高效率。
6.信号量
- 信号量是一个计数器,多进程对共享数据的访问,信号量是用于进程间同步的。
7.套接字 socket
- 套接字是一种通信机制,是不同主机之间的进程进行双向通信的端点。也可看作通信双方的一种约定,用套接字中的函数来完成通信过程。