2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Linux进程间通信(匿名管道)

Linux进程间通信(匿名管道)

时间:2018-12-05 06:51:57

相关推荐

Linux进程间通信(匿名管道)

管道

管道是Linux中很重要的一种通信方式,是通过把一个程序的输出直接连在另一个程序的输入实现通信的,常说的管道是指匿名管道,它与有名管道之间的最大区别就是只能用于父子进程之间。

管道是一种最基本的IPC机制,由pipe函数创建:

#include <unistd.h>

int pipe(int fileds [2]);

调用pipe时在内核中开辟一段缓冲区(管道)用于通信,它有一个读端和一个写端,然后通过fileds参数传出给用户程序两个文件描述符,fileds[0]代表读端,fileds[1]代表写端。所以管道在用户程序面前就像打开一个文件,向这个文件读写数据时其实就是在读写内核缓冲区。

用pipe函数创建管道成功返回0,创建失败返回-1。

管道的结构

传统上有很多种实现管道的方法,如利用文件系统、利用套接字(sockets)、利用流等。在Linux中,使用两个file数据结构来实现管道。这两个file数据结构中的f_inode(f_dentry)指针指向同一个临时创建的VFS I节点,而该VFS I节点本身又指向内存中的一个物理页,如图5.1所示。两个file数据结构中的f_op指针指向不同的文件操作例程向量表:一个用于向管道中写,另一个用于从管道中读。这种实现方法掩盖了底层实现的差异,从进程的角度来看,读写管道的系统调用和读写普通文件的普通系统调用没什么不同。当写进程向管道中写时,字节被拷贝到了共享数据页,当读进程从管道中读时,字节被从共享页中拷贝出来。Linux必须同步对于管道的存取,必须保证管道的写和读步调一致。Linux使用锁、等待队列和信号(locks,wait queues and signals)来实现同步。如下图所示:

管道结构示意图

管道是如何实现通信的

1.父进程创建管道,得到两个文件描述符指向管道的两端

2.父进程利用fork函数创建子进程,同样子进程也有两个文件描述符指向管道的两端

3.父进程关闭fileds[0],子进程关闭fileds[1]。这个时候,父进程可以向管道里写,子进程可以往管道里读。数据从写端流入从读端流出,就实现了通信。

管道的大小

通过下面的代码可以测试管道的容量:

运行结果如下:

可以得到管道容量为65536。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。