gpt4 book ai didi

ruby - 摆脱 ruby​​ stdin/stdout 缓冲

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:54 25 4
gpt4 key购买 nike

我正在尝试编写一个 ruby​​ 脚本来过滤尾部文件的输出 (tail -f log.log | ./my_filter.rb)。我相信我已经将 stdin 和 stdout 设置为同步读取,但我仍然看到我的输出以延迟批处理的形式出现,一次 20 行左右,而不是实时的。

我可以用如下简单的代码重现问题:

#!/usr/bin/ruby     

$stdout.sync = true
$stdin.sync = true

ARGF.each do |line|
puts line
end

我是否缺少消除缓冲的设置或类似的东西?

编辑:澄清一下,如果我只是tail -f 日志,那么我会看到每秒写入很多行。

最佳答案

如果你正在处理文件,你可能需要 IO#fsync ,它说:

Immediately writes all buffered data in ios to disk. Note that fsync differs from using IO#sync=. The latter ensures that data is flushed from Ruby’s buffers, but does not guarantee that the underlying operating system actually writes it to disk.

如果您只是处理标准输入和输出,您也可以尝试要求 io/console查看是否使用 IO::console#ioflush给你你需要的行为。文档说:

Flushes input and output buffers in kernel. You must require ‘io/console’ to use this method.

例如,考虑:

require 'io/console'

ARGF.each do |line|
$stdout.puts line
$stdout.ioflush
end

关于ruby - 摆脱 ruby​​ stdin/stdout 缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com