日期:2014-05-16  浏览次数:20537 次

Linux下进程间通信

?

? 在Linux内核中,进程各自的用户地址空间是相互独立的,当进程与进程之间需要协同工作和交互信息时,内核必须提供一种高效的方法来帮助完成,这就是进程之间的相互通信技术--IPC(Inter Process Communication)。

管道

? (1)管道是半双工的,即一条管道中数据只能单一方向流动

? (2)管道两端的进程必须是父子关系或者具有相同的祖先

? 管道最常用的使用模式是:一个进程首先通过系统调用pipe(int fd[2])创建出一条管道,其中参数fd[2]是一对文件描述符。当系统调用成功后(pipe的返回值是0),fd[0]被赋值为管道的读端。接下来进程调用fork()系统调用创建一个新的子进程,由于子进程会继承父进程打开的文件描述符,因此fd[0],fd[1]在子进程中也可以同样使用。

命名管道

? (first in,first out,FIFO)命名管道,是一种特殊文件,它在文件系统中真实存在。两个或者多个进程可以同时打开并读写FIFO文件以达到进程通信的目的。

? 命名管道的实现与管道类似,都是通过pipesfs文件系统来完成的。不同之处在于管道是通过pipe系统调用创建的,所以当管道的文件描述符关闭或相关的进程退出后管道进就不存在了;而FIFO是通过mknod系统调用创建的,因而在虚拟文件系统中真实存在了一个FIFO文件。所谓命名管道就是利用文件系统(FIFO文件的inode)建立起与管道缓冲区的映射,这样就避免了管道对于父子进程或相关进程的限制。

?

共享内存

? 系统的共享内存进程间通信机制通过将同一块物理内存分别映射到不同进程的虚拟地址空间来实现数据的交换。

?