为什么需要通信
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
通信方式
- 管道(pipe,半双工(单向))
管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入
- 匿名管道(父子进程关系) ls -l | grep string,使用popen函数
- 命名管道(允许无亲缘关系进程间的通信)创建fifo文件,通过open调用实现通信,发送接收的方式
- 消息队列(与命名管道类似)
- 信号量 (信号量是⼀个计数器,⽤于多进程对共享数据的访问,这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件)
- 信号(signal()函数接收信号,kill(),alarm()函数发送信号)
- 共享内存通信
- 套接字通信(socket,可用于不同机器间的进程通信,使用socket(),bind(),listen(),accept()等函数)
消息队列与命名管道的区别
- 消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。
- 同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。
- 接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。