进程间通讯的目的:
- 数据传输:一个进程须要将它的数据发送给另外一个进程,发送的数据量在一个字节到几兆字节之间。D1
- 共享数据:多个进程想要操做共享数据,一个进程对共享数据的修改,别的进程应该马上看到。D2
- 通知事件:一个进程须要向另外一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。D3
- 资源共享:多个进程之间共享一样的资源。为了做到这一点,须要内核提供锁和同步机制。D4
- 进程控制:有些进程但愿彻底控制另外一个进程的执行(如Debug进程),此时控制进程但愿可以拦截另外一个进程的全部陷入和异常,并可以及时知道它的状态改变。D5
进程经过与内核及其它进程之间的互相通讯来协调它们的行为。Linux支持多种进程间通讯(IPC)机制,信号和管道是其中的两种。除此以外,Linux还支持System V 的IPC机制(用首次出现的Unix版本命名)。linux
Linux进程间通讯的发展历史概略:
Linux下的进程通讯手段基本上是从Unix平台上的进程通讯手段继承而来的。而对Unix发展作出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通讯方面的侧重点有所不一样。前者对Unix早期的进程间通讯手段进行了系统的改进和扩充,造成了“system V IPC”,通讯进程局限在单个计算机内;后者则跳过了该限制,造成了基于套接口(socket)的进程间通讯机制。Linux则把二者继承了下来,如图示:socket

早期UNIX进程间通讯:包括管道(Pipe)、命名管道(FIFO)、信号(signal)。函数
System V IPC:包括System V消息队列(Message)、System V信号量(Semaphore)、System V共享内存(Shared Memory)。spa
POSIX IPC:包括POSIX消息队列(Message)、POSIX信号量(Semaphore)、POSIX共享内存(Shared Memory)。线程
linux下进程间通讯的几种主要手段简介:
- 管道(Pipe)及有名管道(named pipe):管道可用于具备亲缘关系进程间的通讯,有名管道克服了管道没有名字的限制,所以,除具备管道所具备的功能外,它还容许无亲缘关系进程间的通讯;
- 信号(Signal):信号是比较复杂的通讯方式,用于通知接受进程有某种事件发生,除了用于进程间通讯外,进程还能够发送信号给进程自己;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又可以统一对外接口,用sigaction函数从新实现了signal函数);
- 报文(Message)队列(消息队列):消息队列是消息的连接表,包括Posix消息队列system V消息队列。有足够权限的进程能够向队列中添加消息,被赋予读权限的进程则能够读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:使得多个进程能够访问同一块内存空间,是最快的可用IPC形式。是针对其余通讯机制运行效率较低而设计的。每每与其它通讯机制,如信号量结合使用,来达到进程间的同步及互斥。
- 信号量(semaphore):主要做为进程间以及同一进程不一样线程之间的同步手段。
- 套接口(Socket):更为通常的进程间通讯机制,可用于不一样机器之间的进程间通讯。起初是由Unix系统的BSD分支开发出来的,但如今通常能够移植到其它类Unix系统上:Linux和System V的变种都支持套接字。