管道通信方式实现:
http://blog.csdn.net/double_happiness/article/details/71685414
在学习完管道的通信方式之后,我们知道管道是用来实现进程之间的相互通信的机制,接下来为了更深一步的学习管道的底层实现,我们需要知道Linux下管道是如何进行组织和管理的,同时管道容量也是必须知晓的一个重要参数,该参数可以在我们使用管道进行通信时,知道应该传送的数据量,下面就展开来探讨这两个问题。
Linux下的管道组织管理方式
管道的内部实现机制:
在Linux中,管道的实现主要是借助文件系统file_struct结构体和VFS的索引节点iNode。通过将两个file结构体指针指向同一个临时的VFS索引节点,而VFS直线一个物理的存储页。
图示:
如果在匿名管道的下,这两个结构体一般是一个父进程和一个子进程,父子进程通过指向同一个管道来实现彼此的数据通信,对于同名管道,两个结构体则没有任何的关系,彼此之间也是相互独立的,一个进程用于向管道中写数据,而另外一个进程用于从管道中读数据。
//管道信息结构
struct pipe_inode_info {
wait_queue_head_t wait; //管道等待队列
unsigned int nrbufs, curbuf;
//包含待读数据的缓冲区数和包含待读数据的第一个缓冲区的索引
struct pipe_buffer bufs[PIPE_BUFFERS]; //管道缓冲区描述符数组
struct page *tmp_page; //高速缓存区页框指针
unsigned int start; //当前管道缓存区读的位置
unsigned int readers; //读进程的标志,或编号
unsigned int writers; //写进程的标志,或编号
unsigned int waiting_writers; //在等待队列中睡眠的写进程的个数
unsigned int r_counter; //与readers类似,但当等待写入FIFO的进程是使用
unsigned int w_counter; //与writers类似,但当等待写入FIFO的进程时使用
struct fasync_struct *fasync_readers; //用于通过信号进行的异步I/O通知
struct fasync_struct *fasync_writers; //用于通过信号的异步I/O通知
};
如何查看当前系统下的管道容量
使用ulimit -a,可以查看到pipe size的大小
当我们不断的向管道中写数据,当管道被写满时写进程就会进入等待状态,此时就可以测试出当前机器下管道的容量
代码实现:
运行结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)