小编CAF*_*FxX的帖子

Linux 中的“泄漏”管道

假设您有一个如下所示的管道:

$ a | b

如果b停止处理标准输入,一段时间后管道填满,并从a标准输出写入,将阻塞(直到b再次开始处理或死亡)。

如果我想避免这种情况,我可能会尝试使用更大的管道(或更简单地说,buffer(1)),如下所示:

$ a | buffer | b

这只会为我争取更多时间,但最终a会停止。

我想要的(对于我正在解决的一个非常具体的场景)是有一个“泄漏”的管道,当它满了时,会从缓冲区中删除一些数据(理想情况下,逐行)让我们a继续处理(正如您可能想象的那样,在管道中流动的数据是可消耗的,即处理数据b不如a能够无阻塞地运行重要)。

总而言之,我希望有一个像有界的、泄漏的缓冲区之类的东西:

$ a | leakybuffer | b

我可能可以用任何语言很容易地实现它,我只是想知道是否有我遗漏的“准备使用”(或类似 bash one-liner 之类的东西)。

注意:在示例中我使用的是常规管道,但该问题同样适用于命名管道


虽然我给出了下面的答案,但我也决定实施leakybuffer 命令,因为下面的简单解决方案有一些限制:https : //github.com/CAFxX/leakybuffer

linux pipe buffer fifo

12
推荐指数
1
解决办法
1217
查看次数

在 Linux 中设置管道容量

有没有办法设置 Bash(或其他 shell)脚本中定义的管道的管道容量?以例如

cmd1 | cmd2

在最近的 Linux 中,管道容量默认设置为 64KB。我知道我可以通过两种方式控制两个进程之间“缓冲”的数据量:

  1. 使用buffer(1):例如cmd1 | buffer | cmd2
  2. 从内部或fcntl(2)F_SETPIPE_SZ标志一起使用cmd1cmd2

每种方案都有缺点:buffer只能用于增加缓冲区;还覆盖默认管道容量仍需要唤醒下游命令。fcntl,据我所知,只能从内部cmd1cmd2.

我的问题是:有没有办法在外壳创建管道时在外壳中指定管道应该具有多少容量?

linux shell bash pipe

7
推荐指数
1
解决办法
1651
查看次数

标签 统计

linux ×2

pipe ×2

bash ×1

buffer ×1

fifo ×1

shell ×1