我正在使用IO#pipe方法,在某个时候我想知道已经将多少字节写入输出流。使用IO#tell会导致错误,但并没有太大帮助-Errno::EINVAL: Invalid argument
-不会说什么在哪里无效。
有一个简单的代码片段可以演示该问题:
read_io, write_io = IO.pipe
write_io.tell #=> #<Errno::EINVAL: Invalid argument>
是否可以编写自己的tell
方法?还是我做错了什么?
答案 0 :(得分:1)
irb(main):007:0> read_io, write_io = IO.pipe
=> [#<IO:fd 9>, #<IO:fd 10>]
irb(main):008:0> read_io.tell
Errno::ESPIPE: Illegal seek
from (irb):8:in `tell'
from (irb):8
from /usr/bin/irb:11:in `<main>'
irb(main):009:0> write_io.tell
Errno::ESPIPE: Illegal seek
from (irb):9:in `tell'
from (irb):9
from /usr/bin/irb:11:in `<main>'
在我的Ruby控制台上,它返回ESPIPE
而不是EINVAL
,这是可以预期的,因为tell
是在Unix环境中使用lseek
实现的,并且返回{{1} },如果文件是pipe。
我们可以通过保持一个计数器来测量写入/读取到管道中的数据量,该计数器在管道上累积ESPIPE
和read()
调用的结果。