当我执行 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/