【问题标题】:How to set pipe size from shell?如何从外壳设置管道尺寸?
【发布时间】:2018-08-01 14:52:10
【问题描述】:

管道缓冲区大小可以在 c 中使用fcntl() 设置。可以直接从 shell 脚本完成吗?

【问题讨论】:

  • @Andreas, ...您能否为该问题提供一些额外的上下文,以便更好地确定它是否实际上是重复的?
  • @CharlesDuffy 尝试使用文件以最简单的方式通过握手来产生同步脉冲,这可用于控制应用程序的帧速率。昨天在 SO 上找到了一种方法(现在找不到,大声笑)提到 stdbuf 来控制 stdio 缓冲,然后我推断 tail 可用于弥合从 stdio 到命名管道的差距; stdbuf -o0 tail -f my_sync_fifostdbuf 几乎可以满足我的要求。
  • 既然如此,听起来您的问题不在于内容被卡在管道中,而是在 libc 中缓冲(实际上,人们更经常感到惊讶)。无论如何,关于是否将问题作为一个骗子来结束 - 虽然目前提出的这个问题不太适用于您的用例,但它可以给出一个明确且正确的答案一个愿意包含一点 C 的人,所以我很想把它打开。
  • @CharlesDuffy 是的,零也是一个大小,不是吗? :-) 你会说stdbuftail 组合是问题的答案吗?如果没有,为什么不呢? (作为记录,我自己的研究表明,最通用的解决方案是为当前用例编写一个微型 C 程序,因为在 shell 中制作同步脉冲很棘手)

标签: linux shell pipe


【解决方案1】:

据我所知,没有标准的 linux 命令行工具可以挂接到 F_SETPIPE_SZ。您可能想看看this previous question,它使用buffer 在两个命令之间添加一个用户大小的缓冲区。虽然它不能将管道的有效大小降低到其默认值以下,但它可以将管道缓冲区的有效大小增加到远远超过操作系统限制/proc/sys/fs/pipe-max-size

【讨论】:

  • 一个标准的命令行工具很难使用,除非你要调整它和exec,所以像... | with-pipe-size 0 16384 -- some-command这样在运行后执行到some-command fcntl(0, F_SETPIPE_SZ, 16384)。但是,如果没有这种使用模式,这将需要一个 shell 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多