加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby on Linux PTY在没有EOF的情况下消失,引发了Errno :: EIO

发布时间:2020-12-16 19:26:02 所属栏目:百科 来源:网络整理
导读:我正在编写一些需要文件的代码,将该文件传递给几个二进制文件之一进行处理,并监视转换过程的错误.我在OSX上编写和测试了以下例程,但由于我不清楚的原因,linux出现故障. #run the command,capture the output so it doesn't displayPTY.spawn(command) {|r,w,
我正在编写一些需要文件的代码,将该文件传递给几个二进制文件之一进行处理,并监视转换过程的错误.我在OSX上编写和测试了以下例程,但由于我不清楚的原因,linux出现故障.
#run the command,capture the output so it doesn't display
PTY.spawn(command) {|r,w,pid|
    until r.eof? do
      ##mark
      puts r.readline
    end
}

运行的命令变化很大,##标记处的代码已被简化为本地回显,以尝试调试问题.命令执行,脚本在终端中打印预期输出,然后抛出异常.

它在Debian系统上产生的错误是:Errno :: EIO(输入/输出错误 – / dev / pts / 0):

所有命令字符串我可以想出产生这个错误,当我运行代码没有本地回声块,它运行很好:

PTY.spawn(command) {|r,pid|}

在这两种情况下,命令本身都执行正常,但是似乎debian linux没有发送pty. PTY的文档页面和ruby-doc上的IO在这里似乎没有任何帮助.

有什么建议么?谢谢.

-vox-

解决方法

所以我不得不去阅读PTY图书馆的C源,以便对这里发生的事情感到非常满意.

Ruby PTY文档并没有真正说明in the source code的意见.

我的解决方案是将一个包装方法放在一起,并从需要的脚本中调用它.我也在等待进程的方法中确定退出并从$?:访问退出状态

# file: lib/safe_pty.rb

require 'pty'
module SafePty
  def self.spawn command,&block

    PTY.spawn(command) do |r,p|
      begin
        yield r,p
      rescue Errno::EIO
      ensure
        Process.wait p
      end
    end

    $?.exitstatus
  end
end

这与PTY.spawn基本相同:

require 'safe_pty'
exit_status = SafePty.spawn(command) do |r,pid|
  until r.eof? do
    logger.debug r.readline
  end
end

#test exit_status for zeroness

发现这是一个有效的回应,因为它完全没有文件的ruby-doc,我感到有点沮丧.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读