微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IO.pipe上的Ruby readpartial不会引发EOFError

如何解决IO.pipe上的Ruby readpartial不会引发EOFError

我试图了解Ruby中的IO.pipe如何工作,在下面的示例中,我将数据发送到io管道,并在完成数据发送后关闭流。在子进程中,我使用readpartial方法读取数据。根据文档,在关闭流时,readpartial应该引发EOFError,但是我最终遇到了被阻塞的进程,我理解的对吗?

# ruby 2.6.3
r,w = IO.pipe

pid = fork do
  loop do
    puts r.readpartial(1024)
    sleep 0.1
  rescue EOFError
    puts "End of File"
    break
  end
end

1000.times do |t|
  w.write "xyz #{t}"
end

w.close

Process.wait(pid)

解决方法

您需要在子级和父级中关闭管道的写端。

在分叉之后,您实际上对管道有两个写端和两个读端。在父级中关闭写端时,子级中的写端仍处于打开状态,因此对readpartial的调用将被阻止。

您只需在分叉孩子后立即致电w.close

pid = fork do
  w.close
  loop do
    #...

通常,您也可以在分叉后立即在父级中关闭读取端(尽管在这种情况下并不重要):

pid = fork do
  #...
end

r.close

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。