使用jruby会导致“ Errno :: EBADF:错误的文件描述符”错误

时间:2018-07-13 01:10:47

标签: ruby jruby

我有一个小的可执行文件,我们将其称为“ decode”(用C编写),该文件在stdin(图像文件)上获取一个数据块,将其转换并将其吐回到stdout。因此,从linux命令行中,以下命令可以正常工作:

cat image_file.format1 | ./irb/decode > image_file.format2

我正在尝试将此二进制文件包装在一些ruby代码中,并消除使用Open3.popen3使用常规文件IO的需要。这是Ruby代码的相关部分:

.
.
.
Open3.popen3("decode") do |stdin, stdout, stderr, wait_thr|
  stdin.write(f)
  stdin.close_write
  @image_data = stdout.read
  @status_message = stderr.read
  exit_status = wait_thr.value
end
.
.
.

变量 f 包含要转换的数据块。我正在将其写入文件,然后在写入的文件上调用 decode 。当尝试使用jruby从irb运行上面的代码时,将获得以下错误回溯(已被稍微清理):

Traceback (most recent call last):
   16: from org/jruby/RubyKernel.java:1180:in `catch'
   15: from org/jruby/RubyKernel.java:1418:in `loop'
   14: from org/jruby/RubyKernel.java:1037:in `eval'
   13: from t:5:in `<eval>'
   12: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:46:in `process'
   11: from org/jruby/RubyKernel.java:311:in `open'
   10: from org/jruby/RubyIO.java:1179:in `open'
    9: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:63:in `block in process'
    8: from org/jruby/ext/stringio/StringIO.java:423:in `each_byte'
    7: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:87:in `block in process'
    6: from /home/user/dev/kf_decoder/lib/kf_decoder/kob.rb:205:in `decodeTiff'
    5: from /home/user/dev/kf_decoder/lib/kf_decoder/tiff.rb:123:in `initialize'
    4: from /home/user/.rbenv/versions/jruby-9.2.0.0/lib/ruby/stdlib/open3.rb:102:in `popen3'
    3: from /home/user/.rbenv/versions/jruby-9.2.0.0/lib/ruby/stdlib/open3.rb:206:in `popen_run'
    2: from org/jruby/RubyKernel.java:1642:in `spawn'
    1: from org/jruby/RubyProcess.java:1570:in `spawn'
Errno::EBADF (Bad file descriptor - irb/decode

有趣的是,如果我使用的是系统ruby解释器或rubinius(我已经安装了这两者,并且可以使用rbenv进行切换),则完全相同的代码在irb中可以正常工作。

谁能告诉我是什么?我正在运行ubuntu linux 18.04 LTS和jruby 9.2.0.0(2.5.0)。出于速度和其他方面的考虑,Jruby是首选的平台,因此我需要使其正常工作。

1 个答案:

答案 0 :(得分:0)

问题与jruby使用的Java版本有关。截至本文发布时,java 9和10不能按我需要的方式与jruby和popen3一起使用。 Java 8可以。有关完整的详细信息,请参见Github上的以下线程:

https://github.com/jruby/jruby/issues/5249