Linux 中的内部管道如何工作?

Linux 中的内部管道如何工作?

当我执行 ps 时,ps 会在列表中显示该进程。
但是当我执行 ps | grep hello 时,尽管 ps 是进程,但显示的是 grep 进程。
管道是这样工作的吗?
管道读取 fd 如何自动关闭?
谢谢

答案1

尽管 ps 是进程,但显示的是 grep

两个都ps grep是进程。您看不到该ps行,因为其中没有“hello”。例如,请尝试ps | grep ".*"改为,或者甚至ps | sort | tac | shuf

换句话说,你有:

  • 流程一:ps aux

    • Fd 0(stdin):终端(/dev/tty)
    • Fd 1 (stdout): 匿名管道 (→write)
    • Fd 2 (stderr): 终端
  • 流程2:grep hello

    • Fd 0 (stdin): 匿名管道(读取→)
    • Fd 1(标准输出):终端
    • Fd 2 (stderr): 终端

跑步同时


这是另一个有趣的测试——要求ls显示其自己的文件描述符:

$ ls -l /proc/self/fd | cat
lrwx------ 1 64 7月 31 14:29 0 -> /dev/pts/1
l-wx------ 1 64 7月 31 14:29 1 -> 管道:[8087631]
lrwx------ 1 64 7月 31 14:29 2 -> /dev/pts/1
lr-x------ 1 64 7 月 31 日 14:29 3 -> /proc/2150013/fd/

$ echo 测试| ls -l /proc/self/fd
lr-x------ 1 64 7月 31 14:29 0 -> 管道:[8086629]
lrwx------ 1 64 7月 31 14:29 1 -> /dev/pts/1
lrwx------ 1 64 7月 31 14:29 2 -> /dev/pts/1
lr-x------ 1 64 7 月 31 日 14:29 3 -> /proc/2150022/fd/

$ echo 测试| ls -l /proc/self/fd | cat
lr-x------ 1 64 7月 31 14:30 0 -> 管道:[8088183]
l-wx------ 1 64 7月 31 14:30 1 -> 管道:[8088184]
lrwx------ 1 64 7月 31 14:30 2 -> /dev/pts/1
lr-x------ 1 64 7 月 31 日 14:30 3 -> /proc/2150056/fd/

相关内容