进程间通信
(1)什么是进程间通信?
进程间通信(IPC)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。
(2)进程间通信的目的是什么?
进程间通信的目的一般有以下几点:
- 数据传输:一个进程需要将它的数据发送给别的进程
- 资源共享:多个进程间需要共享相同的资源
- 进程控制:一个进程需要控制别的进程的执行(如Debug进程),此时控制进程需要拦截另外一个进程的所有陷入和异常,并及时知道它的状态改变
- 通知事件:一个进程需要给另一个(组)进程发送消息,通知它(们)发生了某种事件(如子进程的终止通知父进程)
(3)进程间通信经历了哪几个阶段?
ps:想要快速学习Linux进程间通信接口接口使用的朋友,可以跳过这个问题
- 管道(pipe)是第一个广泛使用的IPC形式,既可以在程序中使用,也可以从shell中使用。管道的问题在于它们只能在具有共同祖先(父子进程关系)的进程间使用,最初的管道称为匿名管道,但是命名管道的出现解决了这个问题。
- System V进程间通信。System V消息队列是在20世纪80年代加入到System V内核中的。后面有陆陆续续的添加了这几种带有System V通信特色的进程间通信方式:共享内存,信号量。直到现在System V进程间通信系列的接口也是比较主流的。
- Posix进程间通信。Posix实时标准最初发布了Posix消息队列,它们可以用在同一主机上的不同进程而不受亲缘关系干扰(事实上只有匿名管道是受的),后来又加入了Posix信号量和Posix共享内存区。
- 互斥锁和条件变量事有Posix线程标准定义的两种同步形式。尽管往往用于线程间的同步,但是它们也能提供不同进程之间的同步。
- 读写锁是另外一种形式的同步。
(4)IPC对象的持续性分为哪些类型?
下图汇总了各种类型IPC对象的持续性:
(5)进程间通信的方法有哪些?分别怎么用?
进程间通信的方法有:
- 匿名管道
- 命名管道
- System V 消息队列
- System V 共享内存
- System V 信号量
- Posix系列:消息队列,共享内存,信号量,互斥量,条件变量,读写锁
PS:下面我只讲解管道和System V系列的进程间通信方法
1.管道
定义:从一个进程连接到另一个进程的数据流称为管道。(‘|’是命令行中管道的符号)
eg:
命令: who | wc -l
创建匿名管道:
函数原型:int pipe(int fd[2])
参数说明:fd是文件描述符数组,fd[0]表示读端,fd[1]表示写端。
返回值:成功则返回0,失败则返回错误码。
使用实例:从键盘读取数据写入管道,然后从管道读取并写到屏幕上。
#include<stdio.h>
#in