linux 中的管道是否异步?
Is pipe in linux asynchronous or not?
我认为当我 运行 在命令下时
sleep 10 | sleep 2 | sleep 5
Linux 过程将是
86014 ttys002 0:00.03 bash
86146 ttys002 0:00.00 sleep 10
when sleep 10
is end -> sleep 2
(when sleep 2 is end)-> sleep 5
我是这么想的
但是在Linuxbashsleep 10, sleep 2, sleep 5
同时在ps
sleep 10
进程的标准输出将被重定向到 sleep 5
的进程
但是,在那种情况下,sleep 5
的过程将在 sleep 10
之前完成
我很困惑,有没有google那个现象的关键字或概念?
(我英文不好,可能看不懂这段文字,谢谢)
我想您希望命令的顺序是 运行。但这不是管道的作用。
到运行两个命令依次使用;
,什么叫做命令列表,我认为:
$ time ( sleep 1 ; sleep 2 )
real 0m3.004s
您还可以使用 &&
(或 ||
)来执行命令列表,以便在一个命令 returns 失败(或成功)时中断序列。
但是当你 运行 两个带有 |
的命令都是 运行 并联时,第一个的 stdout
连接到 stdin
第二个。这样,管道充当同步对象:
- 如果第二个命令更快并清空管道,当它读取时它将等待更多数据
- 如果第一个命令更快并且向管道写入了太多数据,它的缓冲区将填满并且它将阻塞直到读取一些数据。
- 此外,如果第二个命令终止,第一个命令写入
stdout
后,它会立即得到一个 SIGPIPE
,并可能终止。
(请注意如果您的程序不是 运行 并发会发生什么:您的第一个程序可以将数兆字节的文本写入 stdout
,并且没有人读取它,管道会溢出!)
但是由于 sleep
不读取或写入控制台,当您执行 sleep 1 | sleep 2
时没有什么特别的事情发生并且两者都是 运行 同时发生的。
管道中的 3 个或任何其他数量的命令也会发生同样的情况。
净效果是全睡眠时间最长:
$ time ( sleep 1 | sleep 2 | sleep 3 | sleep 4 )
real 0m4.004s
我认为当我 运行 在命令下时
sleep 10 | sleep 2 | sleep 5
Linux 过程将是
86014 ttys002 0:00.03 bash
86146 ttys002 0:00.00 sleep 10
when sleep 10
is end -> sleep 2
(when sleep 2 is end)-> sleep 5
我是这么想的
但是在Linuxbashsleep 10, sleep 2, sleep 5
同时在ps
sleep 10
进程的标准输出将被重定向到 sleep 5
的进程
但是,在那种情况下,sleep 5
的过程将在 sleep 10
我很困惑,有没有google那个现象的关键字或概念?
(我英文不好,可能看不懂这段文字,谢谢)
我想您希望命令的顺序是 运行。但这不是管道的作用。
到运行两个命令依次使用;
,什么叫做命令列表,我认为:
$ time ( sleep 1 ; sleep 2 )
real 0m3.004s
您还可以使用 &&
(或 ||
)来执行命令列表,以便在一个命令 returns 失败(或成功)时中断序列。
但是当你 运行 两个带有 |
的命令都是 运行 并联时,第一个的 stdout
连接到 stdin
第二个。这样,管道充当同步对象:
- 如果第二个命令更快并清空管道,当它读取时它将等待更多数据
- 如果第一个命令更快并且向管道写入了太多数据,它的缓冲区将填满并且它将阻塞直到读取一些数据。
- 此外,如果第二个命令终止,第一个命令写入
stdout
后,它会立即得到一个SIGPIPE
,并可能终止。
(请注意如果您的程序不是 运行 并发会发生什么:您的第一个程序可以将数兆字节的文本写入 stdout
,并且没有人读取它,管道会溢出!)
但是由于 sleep
不读取或写入控制台,当您执行 sleep 1 | sleep 2
时没有什么特别的事情发生并且两者都是 运行 同时发生的。
管道中的 3 个或任何其他数量的命令也会发生同样的情况。
净效果是全睡眠时间最长:
$ time ( sleep 1 | sleep 2 | sleep 3 | sleep 4 )
real 0m4.004s