在 Linux 中设置管道容量

CAF*_*FxX 7 linux shell bash pipe

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

cmd1 | cmd2

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

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

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

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

CAF*_*FxX 2

根据 DepressedDaniel 和 St\xc3\xa9phane Chazelas 的建议,我选择了我能找到的最接近 oneliner 的东西:

\n\n
function hugepipe {\n  perl -MFcntl -e \'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!\' "$@"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这允许执行以下操作:

\n\n
hugepipe <command> | <command>\n
Run Code Online (Sandbox Code Playgroud)\n\n

两个命令之间的管道将具有通过fcntlperl 脚本中指定的容量。

\n