每天一个Linux命令-管道

  经常被问到进程间是怎么通信的?常见的有socket,管道,消息队列,共享内存等。以后会专门写一个总结一下,这次研究一下管道是什么?
  一般遇到这种名词的话一般都会想这个是用来解决什么问题了,又是怎么解决的。

  • 解决了什么问题?
      * 前面提到了解决了进程间通信的问题,比如一个很简单的例子,想要在nohup.out中搜索某个关键字,cat nohup.out | grep “key” cat是一个进程,grep也是一个进程,它们是怎么通信的。
     * 怎么解决的?
       * 上面命令中的 | 就相当于在两个进程之间建立了一个管道(是一个虚拟的文件,是由内存管理的一个缓冲区),一头对应着一个进程的输出端,一头对应着另一个进程的输入端,上面的例子就是将cat命令的输出作为grep的输入。

      linux的进程都有独立的地址,因此在用户态进程之间是没法访问的。而内核是进程共享的,因此线程想要通信就要内核做个中间人。
    avatar
      pipe的实现和图示一样,在pipefs文件中有一个属性

    struct pipe_inode_info *i_pipe;

      pipe_inode_info定义如下:

    pipe_fs_i.h
    struct pipe_inode_info {
     struct mutex mutex;
     wait_queue_head_t wait;
     unsigned int nrbufs, curbuf, buffers;
     unsigned int readers;
     unsigned int writers;
     unsigned int files;
     unsigned int waiting_writers;
     unsigned int r_counter;
     unsigned int w_counter;
     struct page *tmp_page;
     struct fasync_struct *fasync_readers;
     struct fasync_struct *fasync_writers;
     struct pipe_buffer *bufs;
     struct user_struct *user;
     };

本网站发布的一切文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请联系邮箱:1194325527@qq.com处理

目录
×

给作者杯卡布奇诺

github