Linux管道"|"
管道
进程间通信的的方式之一。在Linux的世界中,一切皆文件。所以管道也是一种文件。实际上,管道是只存在于内存中的文件。常说的管道指的是无名管道,主要用于父进程与子进程之间,或者两个兄弟进程之间。为了解决管道只能在拥有血缘关系的进程间使用的问题,Linux提供了FIFO方式连接进程,FIFO又被称为命名管道(named PIPE)。命名管道是一种特殊的文件类型,归Linux内核管理。
实现机制
管道是一个由内核管理的缓冲区(一般为4K大小)。管道的两端分别连接两个进程,一端连接进程的输出,负责向管道中放入数据;另一端连接另一个进程的输入,负责从管道中获取数据。管道被设计成环形的数据结构,可以循环使用。
如果管道中无数据可以获取,那读进程会阻塞等待,直到有数据可取;如果管道中的数据被放满,负责放入的进程会等待,直到有另一端的进程取走了数据。管道会随着两端进程的终止而消失。

示例
-
打开Linux系统终端,查看当前终端的进程ID;
~$ echo $BASHPID 18480 -
使用管道,连接不同的命令;
~$ echo $$; read | cat 18480当前终端的命令执行情况:
- 管道前
echo $$输出了当前进程ID;然后readIO阻塞等待用户输入; - 管道后的
cat命令在等待管道前read命令的输出;
- 管道前
-
查看当前终端的进程的父子关系;
~$ 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.
-
查看进程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 -
查看进程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连接,通过这种方式来实现两个进程间的通信。
Linux管道是一种进程间通信的方式,它通过内核管理的缓冲区连接两个进程,允许数据在它们之间传递。管道是无名的,常用于父进程与子进程之间,但命名管道FIFO可以连接无血缘关系的进程。管道具有阻塞特性,当无数据可读或缓冲区已满时,相应进程会等待。示例展示了如何在终端中使用管道连接命令,以及通过`ps`和`ls`命令查看进程和文件描述符,揭示了管道如何在不同进程间实现数据流动。
2481

被折叠的 条评论
为什么被折叠?



