gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:50 25 4
gpt4 key购买 nike

我正在编写一些代码,它获取一个文件,将该文件传递给多个二进制文件之一进行处理,并监视转换过程中的错误。我已经在 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 (Input/output error -/dev/pts/0):

我能想到的所有命令字符串都会产生该错误,当我在没有本地 echo block 的情况下运行代码时,它运行得很好:

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

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

有什么建议吗?谢谢。

-声音-

最佳答案

所以我不得不阅读 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,w,p|
begin
yield r,w,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,w,pid|
until r.eof? do
logger.debug r.readline
end
end

#test exit_status for zeroness

当我发现这是一个有效的回应时,我感到非常沮丧,因为它在 ruby​​-doc 上完全没有记录。

关于Linux 上的 Ruby PTY 在没有 EOF 的情况下消失,引发 Errno::EIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10238298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com