【问题标题】:use of jruby causes "Errno::EBADF: Bad file descriptor" error使用 jruby 会导致“Errno::EBADF: Bad file descriptor”错误
【发布时间】:2018-12-21 07:41:03
【问题描述】:

我有一个小可执行文件,我们称之为“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 是首选平台,所以我需要让它工作。

【问题讨论】:

    标签: ruby jruby


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2013-12-31
      相关资源
      最近更新 更多