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