如何解决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 举报,一经查实,本站将立刻删除。