【发布时间】: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 是首选平台,所以我需要让它工作。
【问题讨论】: