Linux管道

Linux管道是一种进程间通信的方式,它通过内核管理的缓冲区连接两个进程,允许数据在它们之间传递。管道是无名的,常用于父进程与子进程之间,但命名管道FIFO可以连接无血缘关系的进程。管道具有阻塞特性,当无数据可读或缓冲区已满时,相应进程会等待。示例展示了如何在终端中使用管道连接命令,以及通过`ps`和`ls`命令查看进程和文件描述符,揭示了管道如何在不同进程间实现数据流动。

Linux管道"|"

管道

​ 进程间通信的的方式之一。在Linux的世界中,一切皆文件。所以管道也是一种文件。实际上,管道是只存在于内存中的文件。常说的管道指的是无名管道,主要用于父进程与子进程之间,或者两个兄弟进程之间。为了解决管道只能在拥有血缘关系的进程间使用的问题,Linux提供了FIFO方式连接进程,FIFO又被称为命名管道(named PIPE)。命名管道是一种特殊的文件类型,归Linux内核管理。

实现机制

​ 管道是一个由内核管理的缓冲区(一般为4K大小)。管道的两端分别连接两个进程,一端连接进程的输出,负责向管道中放入数据;另一端连接另一个进程的输入,负责从管道中获取数据。管道被设计成环形的数据结构,可以循环使用。

​ 如果管道中无数据可以获取,那读进程会阻塞等待,直到有数据可取;如果管道中的数据被放满,负责放入的进程会等待,直到有另一端的进程取走了数据。管道会随着两端进程的终止而消失。

在这里插入图片描述

示例
  1. 打开Linux系统终端,查看当前终端的进程ID;

    ~$ echo $BASHPID
    18480
    
  2. 使用管道,连接不同的命令;

    ~$ echo $$; read | cat
    18480
    
    

    当前终端的命令执行情况:

    • 管道前echo $$输出了当前进程ID;然后readIO阻塞等待用户输入;
    • 管道后的cat命令在等待管道前read命令的输出;
  3. 查看当前终端的进程的父子关系;

    ~$ ps-ef |grep 18480
    idriver  18480 13718  0 12月14 pts/8  00:00:00 -/bin/bash
    idriver  24990 18480  0 15:01 pts/8    00:00:00 -/bin/bash
    idriver  24991 18480  0 15:01 pts/8    00:00:00 cat
    idriver  27800  8596  0 15:05 pts/9    00:00:00 grep --color=auto 18480
    

    当前终端的bash进程有两个子进程,分别是管道后的cat进程,进程ID是24991;管道前的read进程,进程ID是24990.

  4. 查看进程24990所打开的文件情况;

    ~$ lsof -op 24990
    COMMAND   PID    USER   FD   TYPE DEVICE OFFSET     NODE NAME
    bash    24990 default  cwd    DIR  259,3        11010050 /home/default
    bash    24990 default  rtd    DIR  259,3               2 /
    bash    24990 default  txt    REG  259,3         4980738 /bin/bash
    bash    24990 default  mem    REG  259,3         8128166 /lib/x86_64-linux-gnu/libnss_files-2.27.so
    bash    24990 default  mem    REG  259,3         8128160 /lib/x86_64-linux-gnu/libnsl-2.27.so
    bash    24990 default  mem    REG  259,3         8128177 /lib/x86_64-linux-gnu/libnss_nis-2.27.so
    bash    24990 default  mem    REG  259,3         8128162 /lib/x86_64-linux-gnu/libnss_compat-2.27.so
    bash    24990 default  mem    REG  259,3         3810799 /usr/lib/locale/locale-archive
    bash    24990 default  mem    REG  259,3         8128086 /lib/x86_64-linux-gnu/libc-2.27.so
    bash    24990 default  mem    REG  259,3         8128103 /lib/x86_64-linux-gnu/libdl-2.27.so
    bash    24990 default  mem    REG  259,3         8128232 /lib/x86_64-linux-gnu/libtinfo.so.5.9
    bash    24990 default  mem    REG  259,3         8128058 /lib/x86_64-linux-gnu/ld-2.27.so
    bash    24990 default  mem    REG  259,3         4326583 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
    bash    24990 default    0u   CHR  136,8    0t0       11 /dev/pts/8
    bash    24990 default    1w  FIFO   0,13    0t0 10386462 pipe
    bash    24990 default    2u   CHR  136,8    0t0       11 /dev/pts/8
    bash    24990 default  255u   CHR  136,8    0t0       11 /dev/pts/8
    
  5. 查看进程24991所打开的文件情况;

    ~$ lsof -op 24991
    COMMAND   PID    USER   FD   TYPE DEVICE OFFSET     NODE NAME
    cat     24991 default  cwd    DIR  259,3        11010050 /home/default
    cat     24991 default  rtd    DIR  259,3               2 /
    cat     24991 default  txt    REG  259,3         4980753 /bin/cat
    cat     24991 default  mem    REG  259,3         3810799 /usr/lib/locale/locale-archive
    cat     24991 default  mem    REG  259,3         8128086 /lib/x86_64-linux-gnu/libc-2.27.so
    cat     24991 default  mem    REG  259,3         8128058 /lib/x86_64-linux-gnu/ld-2.27.so
    cat     24991 default    0r  FIFO   0,13    0t0 10386462 pipe
    cat     24991 default    1u   CHR  136,8    0t0       11 /dev/pts/8
    cat     24991 default    2u   CHR  136,8    0t0       11 /dev/pts/8
    

​ 查看上面的结果,进程24990的标准输出重定向到类型为先进先出 (FIFO) 队列的索引节点为10386462的文件。进程24991的标准输入重定向类型为先进先出 (FIFO) 队列的索引节点为10386462的文件。内核通过管道将进程24990和进程24991连接,通过这种方式来实现两个进程间的通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值