【Linux的高级应用编程】进程间的通信机制


进程间的通信机制

Sailor_forever [email protected] 转载请注明

http://blog.csdn.net/sailor_8318/archive/2008/12/30/3658912.aspx

 

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。因为那些通信手段的效率太低了,而人们对进程间通信的要求是要有一定的实时性。

 

Linux间进程的通信机制来源颇多,其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。

 

1、管道pipe:管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。适用于生产者消费者模型,是一种单向的数据流,一个进程写入数据另外一个进程读取数据。管道基于文件系统,对管道的读写采用read及write系统调用。在最后一个访问管道的进程终止后,管道就被完全删。Pipe的不足之处在于无法打开已经存在的pipe,这样不便于任意两个进程实现共享,除非此管道由共同的祖先创建。

 

2、FIFO命名管道:克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道存在于目录树中,在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

 

3、信号:信号是比较复杂的通信方式,用于通知接收进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction。

 

4、System V IPC:

IPC资源可以由任何进程共享,当需要访问资源时动态建立IPC数据结构,并作为一个IPC标识,进程间通过此标识访问共享资源。不足是关键字KEY_T使用了内核标识,占用了内核资源,而且只能被显式删除

 

信号灯Semaphores:用于各个进程间的互斥,比内核信号量更为复杂,其为一个或者多个信号量的集合而非象内核一样只有一个值,另外其具备失效安全机制,防止进程异常死亡时无法释放信号量。操作顺序为:semget、semop、semop、semctl。

 

消息messages:一个进程将消息发往消息队列中,另外一个进程从中读取,读取之后内核将销毁此消息,因此一个消息只可能被一个进程接收。消息由一个公用头和可变长度的数据组成。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

 

共享内存shared memory:多个进程可以将资源放在共享内存中进行共享,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

 

5、Socket套接字:允许同一个甚至是不同主机上的进程进行通信,如X windows即是利用socket进行通信。

 

参考文献:

UNIX环境高级编程,作者:W.Richard Stevens,译者:尤晋元等,机械工业出版社

linux内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学出版社

UNIX网络编程第二卷:进程间通信,作者:W.Richard Stevens,译者:杨继张,清华大学出版社。

深入理解Linux内核 第19章进程通信

深刻理解Linux进程间通信(IPC)

http://blog.chinaunix.net/u/786/showart.php?id=16443

Linux系统下进程间通信主要几种手段


你可能感兴趣的:(C++,Linux)