进程间通讯就是在不一样进程之间传播或交换信息,那么不一样进程之间存在着什么双方均可以访问的介质呢?进程的用户空间是互相独立的,通常而言是不能互相访问的,惟一的例外是共享内存区。可是,系统空间倒是“公共场所”,因此内核显然能够提供这样的条件。除此之外,那就是双方均可以访问的外设了。在这个意义上,两个进程固然也能够经过磁盘上的普通文件交换信息,或者经过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通讯的手段,可是通常都不把这算做“进程间通讯”。由于那些通讯手段的效率过低了,而人们对进程间通讯的要求是要有必定的实时性。html
一.Linux下进程间通讯的几种主要手段简介:数据库
1.管道(Pipe)及有名管道(named pipe):管道可用于具备亲缘关系进程间的通讯,有名管道克服了管道没有名字的限制,所以,除具备管道所具备的功能外,它还容许无亲缘关系进程间的通讯;ide
管道包括三种:1)普通管道PIPE, 一般有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用. 2)流管道s_pipe: 去除了第一种限制,能够双向传输. 3)命名管道:name_pipe, 去除了第二种限制,能够在许多并不相关的进程之间进行通信.函数
2.信号(Signal):信号是比较复杂的通讯方式,用于通知接受进程有某种事件发生,除了用于进程间通讯外,进程还能够发送信号给进程自己;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又可以统一对外接口,用sigaction函数从新实现了signal函数);ui
3.报文(Message)队列(消息队列):消息队列是消息的连接表,包括Posix消息队列systemV消息队列。有足够权限的进程能够向队列中添加消息,被赋予读权限的进程则能够读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。spa
4.共享内存:使得多个进程能够访问同一块内存空间,是最快的可用IPC形式。是针对其余通讯机制运行效率较低而设计的。每每与其它通讯机制,如信号量结合使用,来达到进程间的同步及互斥。.net
5.信号量(semaphore):主要做为进程间以及同一进程不一样线程之间的同步手段。线程
6.套接口(Socket):更为通常的进程间通讯机制,可用于不一样机器之间的进程间通讯。起初是由Unix系统的BSD分支开发出来的,但如今通常能够移植到其它类Unix系统上:Linux和System V的变种都支持套接字。设计
二.相关问题unix
FAQ1: 管道与文件描述符,文件指针的关系?
答: 其实管道的使用方法与文件相似,都能使用read,write,open等普通IO函数. 管道描述符相似于文件描述符. 事实上, 管道使用的描述符, 文件指针和文件描述符最终都会转化成系统中SOCKET描述符. 都受到系统内核中SOCKET描述符的限制. 本质上LINUX内核源码中管道是经过空文件来实现.
FAQ2: 管道的使用方法?
答: 主要有下面几种方法: 1)pipe, 建立一个管道,返回2个管道描述符.一般用于父子进程之间通信. 2)popen, pclose: 这种方式只返回一个管道描述符,经常使用于通讯另外一方是stdin or stdout; 3)mkpipe: 命名管道, 在许多进程之间进行交互.
FAQ3: 管道与系统IPC之间的优劣比较?
答: 管道: 优势是全部的UNIX实现都支持, 而且在最后一个访问管道的进程终止后,管道就被彻底删除;缺陷是管道只容许单向传输或者用于父子进程之间.
系统IPC: 优势是功能强大,能在绝不相关进程之间进行通信; 缺陷是关键字KEY_T使用了内核标识,占用了内核资源,并且只能被显式删除,并且不能使用SOCKET的一些机制,例如select,epoll等.
FAQ4: WINDOS进程间通讯与LINUX进程间通讯的关系?
答: 事实上,WINDOS的进程通讯大部分移植于UNIX, WINDOS的剪贴板,文件映射等均可从UNIX进程通讯的共享存储中找到影子.
FAQ5: 进程间通讯与线程间通讯之间的关系?\
答: 由于WINDOWS运行的实体是线程, 狭义上的进程间通讯实际上是指分属于不一样进程的线程之间的通信.而单个进程之间的线程同步问题可归并为一种特殊的进程通讯.它要用到内核支持的系统调用来保持线程之间同步. 一般用到的一些线程同步方法包括:Event, Mutex, 信号量Semaphore, 临界区资源等.
三.进程间通讯各类方式效率比较
类型 |
无链接 |
可靠 |
流控制 |
记录 |
消息类型优先级 |
普通PIPE |
N |
Y |
Y |
N |
|
流PIPE |
N |
Y |
Y |
N |
|
命名PIPE(FIFO) |
N |
Y |
Y |
N |
|
消息队列 |
N |
Y |
Y |
Y |
|
信号量 |
N |
Y |
Y |
Y |
|
共享存储 |
N |
Y |
Y |
Y |
|
UNIX流SOCKET |
N |
Y |
Y |
N |
|
UNIX数据包SOCKET |
Y |
Y |
N |
N |
注:无链接: 指无需调用某种形式的OPEN,就有发送消息的能力
流控制: 若是系统资源短缺或者不能接收更多消息,则发送进程能进行流量控制
参考自:http://blog.chinaunix.net/uid-21411227-id-1826900.html