在Linux中设置管道容量

Modified on: Sat, 30 Jun 2018 06:49:30 +0800

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

cmd1 | cmd2

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

  1. 使用buffer(1):例如cmd1 | buffer | cmd2
  2. fcntl(2)F_SETPIPE_SZcmd1
  3. 内的cmd2标志一起使用 醇>

    每个解决方案都有缺点:buffer只能用于增加缓冲区;同时写入默认管道容量仍需要唤醒下游命令。据我所知,fcntl只能从cmd1cmd2内部调用。

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

作者:CAFxX

最佳答案

根据DepressedDaniel和StéphaneChazelas的建议,我找到了最接近我能找到的oneliner的东西:

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

这允许:

hugepipe <command> | <command>

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

作者:CAFxX

相关问答

添加新评论