在答案被接受后更新可能是不好的,但原始答案有点误导。ruby是否会单独
write(2)
对自动附加换行符的调用取决于输出IO对象的缓冲状态。
$stdout
(当连接到tty时)通常是线路缓冲的,因此
puts()
--给定大小合理的字符串——隐式添加换行符是对
写作(2)
然而,情况并非如此
IO.pipe
和
$stderr
正如OP所发现的那样。
原始答案
更换你的主管
pipe.puts()
论点是
换行符终止
字符串:
pipe.puts "##{c} ... #{i}\n" # <-- note the newline
为什么?你设置
pipe.sync
希望管道写入是原子的、非交错的,因为它们(可能)小于
PIPE_BUF
字节。但没用,因为鲁比的烟斗
puts()
实施
这就是为什么你的写有时会在预期换行的地方交错。
以下是你剧本分叉后的一段摘录:
$ strace -s 2048 -fe trace=write ./so-1326067.rb
....
4574 write(4, "#0:12 tiga => 3, 3 => tiga #0:12", 32) = 32
4574 write(4, "\n", 1)
....
但是,添加自己的换行符可以解决这个问题,确保您的整个记录在一个系统调用中传输:
....
5190 write(4, "#194:41 tujuh => 7, 7 => tujuh #194:41\n", 39 <unfinished ...>
5179 write(4, "#183:38 enam => 6, 6 => enam #183:38\n", 37 <unfinished ...>
....
如果由于某种原因无法为您工作,则必须协调进程间互斥体(如
File.flock()
).