• Linux--管道pipe


    管道是一种最基本的IPC机制,由pipe函数创建:
    #include <unistd.h>

    int pipe(int filedes[2]);

    调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过filedes参数传出给用户

    程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输出1是标准输出⼀样)。

    所以管道在用户程序看起来就像一个打开 的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实

    是在读写内核缓冲区。 pipe函数调用成功返回0,调用失败返回-1。

    利用管道实现进程间通信的过程:

    1. 父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
    2. 父进程调用fork创建子进程,那么子进程也有两个⽂件描述符指向同⼀管道。
    3. 父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数

    据从写端流入从读端流出,这样就实现了进程间通信。

    管道的容量:

    方法一:使用linux的ulimit -a来查看系统限制:

    所以一次原子输入的大小为:512Byte * 8=4096Byte;

    查看缓冲条目个数:cat /usr/src/kernels/3.10.0-327.el7.x86_64/include/linux/pipe_fs_i.h文件,

    发现有16个缓冲条目,于是计算出管道的容量大小为:16*4096Byte=64kb;

    方法二:我们也可以通过查手册:man 7 pipe查询管道的容量pipe capacity:

    方法三:利用程序计算管道的容量:

    运行结果显示:

    所以管道的容量为65535/1024=64kb;

    管道的内部组织方式:

      在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。

    通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。两个

    file 数据结构,但它们定义文件操作例程地址是不同的,其中一个是向管道中写入数据的例程地址,而另一个是从管

    道中读出数据的例程地址。这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管

    道这一特殊操作。

  • 相关阅读:
    [swustoj 411] 售货员的难题
    白书P61
    白书P60
    [ZOJ 3471] Most Powerful
    [HDU 3001] Travelling
    [转] acmer必看的26个对acm态度
    [HDU 1254] 推箱子
    [POJ 3311] Hie with the Pie
    [POJ 3254] Corn Fields
    power
  • 原文地址:https://www.cnblogs.com/hanxiaoyu/p/5683248.html
Copyright © 2020-2023  润新知