【linux之进程通信学习】 管道

参阅https://blog.csdn.net/wangpengqi/article/details/7996182

           https://blog.csdn.net/jelly_9/article/details/72885696

        https://www.cnblogs.com/zengyiwen/p/e8af787e31775965f2362b8265058759.html


1.管道简述

管道是用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,称pipe 文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接收管道输出的接收进程(即读进程),可从管道中接收数据。即管道读函数pipe_read()和管道写函数pipe_wrtie();


2.管道的特点

• 互斥  一个进程正在对pipe 进行读/写操作时,另一个进程必须等待。
• 同步  当写(输入)进程把一定数量(如4KB)数据写入pipe 后,便去睡眠等待,直到读(输出)进程取走数据后,再把它唤  醒。当读进程读到一空pipe 时,也应睡眠等待,直至写进程将数据写入管道后,才将它唤醒。
• 对方是否存在。只有确定对方已存在时,才能进行通信。
• 限制管道的大小。实际上,管道是一个固定大小的缓冲区。该缓冲区大小为1 页,即4KB,用满后,随后对管道的write()调用将 默认地被据被阻塞等待某些数据被读取,以腾出足够的空间write()调用。
• 读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。

注意,从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。


3.实现过程

  • 父进程创建管道
  • 父进程forlk出子进程
  • 父进程关闭写端,子进程关闭读端,即让子进程往管道里写,父进程读取管道内容

4.代码实现

通过pipe()函数创建管道。pipe()的参数是指向两个元素的整型数组的指针,它将由调用两个所要求的文件描述符填入。

#include <unistd.h>
int pipe(int fd[2]);
fd[0]指向管道的读端,fd[1]指向管道的写端。

返回值:成功返回1,失败返回-1

注意:在pipe的参数中,没有路径名,这表明,创建管道并不象创建文件一样,要为它创建一个目录连接。这样做的好处是,其它现存的进程无法得到该管道的文件描述符,从而不能访问它。那么两个进程如何使用一个管道来通信呢?

答:fork()exec()系统调用可以保证文件描述符的复制品既可供双亲进程使用,也可供它的子女进程使用

这里更明确的含义是:一个普通的管道仅可供具有共同祖先(已经建立了供它们使用的管道)的两个进程之间共享,。
















猜你喜欢

转载自blog.csdn.net/qq_38041239/article/details/80525062