标签:管道
每个进程各自有着不同的用户地址空间,任何一个进程的全局变量在另一个进程中是看不到的,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2在从内核中把数据读走,内核提供的这种机制称为进程间通信。
进程间通信的本质:让不同的进程看到同一份系统资源。
进程通信方式:管道(pipe)
pipe函数:
#include <unistd.h> int pipe(int fd[2]);
调用pipe函数时在内核中开辟一块缓冲区(管道)用于通信,它有一个读端一个写端,通过fd[2]参数传出给用户程序两个文件描述符,fd[0]指向管道的读端,fd[1]指向管道的写端。管道在用户程序看起来就像一个打开的文件。向文件读数据其实就是在读内核缓冲区。
开辟管道之后如何实现两个进程间的通信呢?
注:文件描述符0,1,2分别表示标准输入,标准输出,标准错误。
过程描述:父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端,父进程调用fork函数创建子进程,子进程也有两个文件描述符指向同一管道。父进程关闭管道读端,子进程关闭写端。父进程可以往管道中写,子进程可以从管道中读,管道是用环形队列实现,数据从写端流入从读端流出,从而实现进程间通信。
特征:
(1)文件描述符表会被子进程继承下去
(2)管道依赖文件系统,允许具有血缘关系的进程,常用于父子进程。
(3)管道只允许进行单向通信。要想进行双向,需创建两个管道
(4)管道面向字节流的数据传输符
(5)管道随进程。即进程在管道在,进程消失管道消失。
测该系统的管道容量。
思路:一直写,不关闭读,当管道被写满时,写被操作系统终止
测试结果:
本文出自 “一起去看星星” 博客,请务必保留此出处http://10810429.blog.51cto.com/10800429/1827135
标签:管道
原文地址:http://10810429.blog.51cto.com/10800429/1827135