进程间通信由哪些方式?
- 管道
- 信号量
- 信号
- 消息队列
- 共享内存
- 套接字
1、管道
实现原理:队列,头指针写,尾指针读
局限性:基于队列的数据结构,数据只能读一次
管道是半双工。
匿名管道:父子进程通信
有名管道:任意两个进程之间通信
管道数据存放在内存,但是有名管道存放在磁盘(但该文件大小永远为0)
详解传送:管道详解
2、信号量
临界资源:一次只允许一个进程访问的资源
临界区:访问临界资源的代码
信号量:是一种特殊的变量,用来控制对临界资源的使用
信号量机制通过P、V操作实现。P操作:原子减1,申请资源。V操作:原子加1,释放资源。
详解传送:信号量
3、信号
信号是进程间通信的一种方式,进程通过收到不同的信号作出不同的反应来达到通信的目的。举例来说:进程A给进程B发送信号,进程B收到信号前在执行自己的代码。但当进程B收到信号后无论执行在什么位置,都要暂停运行去处理信号,处理完信号(处理方式也可以是忽略)再执行自己的代码。
信号4要素:编号、名称、事件、默认动作。
信号产生的5种方式:(1)键盘(2)系统调用(3)软件条件的产生。如定时器(4)命令(5)硬件产生
阻塞信号集:在pcb种。阻塞信号集种存放的是要屏蔽的信号。如果不想进程处理某个信号,就把它放在阻塞信号集中。
未决信号集:没有被处理的信号放在未决信号集中。
相关函数:
- kill():发送信号
- raise():给自己发信号
- abort():给自己发送异常终止信号
- alarm():设置定时器
- settitimer():实现周期性触发
- signal():信号捕捉
详解传送:信号
4、消息对列
消息队列提供了一种向另一个进程发送数据块的功能。
消息队列的使用步骤:
- 创建消息队列
- 把消息放入消息队列/从消息队列中取出信息
- 删除消息队列
详解传送:消息队列
5、共享内存
共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。共享内存的具体实现是不同进程共享的内存安排为同一段物理地址。
共享内存的使用步骤:
- 创建共享内存
- 将共享内存连接到进程
- 操作共享内存(读写)
- 释放共享内存
6、套接字
通过套接字可以是两个进程在网络上进行“通话”。