从IO#pipe获得的写入流的数据大小

时间:2018-06-19 12:31:54

标签: ruby io

我正在使用IO#pipe方法,在某个时候我想知道已经将多少字节写入输出流。使用IO#tell会导致错误,但并没有太大帮助-Errno::EINVAL: Invalid argument-不会说什么在哪里无效。
有一个简单的代码片段可以演示该问题:

read_io, write_io = IO.pipe
write_io.tell #=> #<Errno::EINVAL: Invalid argument>

是否可以编写自己的tell方法?还是我做错了什么?

1 个答案:

答案 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

我们可以通过保持一个计数器来测量写入/读取到管道中的数据量,该计数器在管道上累积ESPIPEread()调用的结果。