每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Com),也就是说进程通信使不同的进程可以看见同一份系统资源。
★ 管道与文件描述符以及文件指针间的关系
管道的使用方法与文件类似,都能使用read,write,open等普通IO函数。
管道描述符类似于文件描述符。事实上, 管道使用的描述符,文件指针和文件描述符最终都会转化成系统中SOCKET描述符,都受到系统内核中SOCKET描述符
的限制,本质上LINUX内核源码中管道是通过空文件来实现。
★ 管道的使用方法
1)pipe:创建一个管道,返回两个管道描述符,通常用于父子进程间的通讯。
2)popen,pclose:只返回一个管道描述符,这种方式常用于通信的另一方是stdin或stdout。
3)mkpipe:命名管道,在多进程间实现交互。
1、管道是一种最基本的IPC机制,由pipe函数来创建
#incldue<unistd.h>
int pipe(int filedes[2]);
调用pipe函数时在内核中开辟一块缓冲区(称为管道),用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(0想象为“口”进行读,1想象为“笔”进行写)。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0])或者write(filedes[1])向这个文件读写数据,其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1。 开辟了管道之后如何实现两个进程间的通信呢?比如可以按下面的步骤通信mni
按以下步骤实现两个进程间的通信:
⑴、父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
⑵、父进程调用fork创建子进程,此时子进程也有两个文件描述符指向同一管道。
⑶、父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用循环队列实现的,数据从写端流入,从读端流出,这样就实现了进程间通信。
父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道,如下图
2、管道特点