进程间通信(IPC:Inner Proceeding Communication)
进程是操作系统实现程序独占系统执行的假象的方法。是对处理器、主存、I/O设备的抽象表示。每一个进程都是一个独立的资源管理单元,每一个进程所示是自己独占使用系统的假象。因此各个进程之间是不可以直接的訪问对方进程的资源的,不同的进程之间进行信息交互须要借助操作系统提供的特殊的进程通信机制。
进程之间的通信。从物理上分,能够分为同主机的进程之间的通信和不同主机间的进程之间的通信。从通信内容方式上分。能够分为数据交互、同步通信、异步通信。
Linux系统进程之间的通信方式大致例如以下图所看到的
集合上述两种从物理和内容方式的划分,能够这样理解上图:
(1)同主机进程间数据交互机制:无名管道(PIPE)、有名管道(FIFO)、消息队列(Message Queue)和共享内存(Shared Memory)。
(2)同主机进程间同步通信机制:信号量(Semaphore)。
(3)同主机进程间异步通信机制:信号(Signal)。
(4)不同主机间进程数据交互机制:套接字(Socket)、远程调用RPC(Remote Procedure Call)。
管道通信
管道又能够分为无名管道和命名管道,两者的用途是不一样的。
无名管道PIPE:主要用于具有亲缘关系的进程之间的通信,无名管道的通信是单向的。仅仅能由一段到另外一段;无名管道是暂时性的。完毕通信后将自己主动消失。
一般採用先创建无名管道,再创建子进程,使子进程继承父进程的管道文件描写叙述符,从而实现父子进程间的通信。在非亲缘关系管道之间,假设想利用无名管道进行通信。则须要借助另外的文件描写叙述符传递机制。
有名管道FIFO:有名管道是一个实际存在的特殊文件,利用有名管道能够实现同主机随意进程之间的数据交互。
Shell中的无名管道
在Shell命令行中使用无名管道是到过管道符“ | ” 实现的。如以下的shell命令将cat命令的输出通过管道传递给grep命令的输入。
无名管道是一种特殊的文件,这就意味着你能够向操作文件一样操作无名管道,无名管道在内核中相应的是一段特殊的内存空间,这段内存空间由操作系统进行管理,对用户是不可见的,在用户空间的应用程序中仅仅能通过系统调用来訪问它。在这段内存空间中以循环队列的方式来暂时存储一个进程发往另外一个进程的信息,而且在通信完毕后就会自己主动释放相应的空间。
Linux C编程中的无名管道
1、创建无名管道
创建无名管道须要使用pipe(int _pipedes[2])函数,这个函数的參数是一个含有两个元素的整型数组,假设运行成功,这个整形数组将分别存储无名管道读端的文件描写叙述符和写端的文件描写叙述符,利用这两个读、写文件描写叙述符,我们能够像读写文件一样,操作无名管道的读写。如pipe( )函数调用失败将返回-1。
2、读写无名管道
以下的程序是在一个程序中完毕,即一个进程既充当读进程又充当写进程。
#include<stdio.h> #include<unistd.h> #include<string.h> int main() { int p[2]; char *str = "HelloWorld"; //待写入无名管道的字符串 char buf[128]; //读取无名管道时的缓冲区 memset(buf,'