1

我有两个版本的方法,我都遇到了同样的问题。

版本 1

def read_char
  $stdin.raw!
  input = $stdin.getc.chr
  if input == "\e" then
     input << $stdin.read_nonblock(3) rescue nil
     input << $stdin.read_nonblock(2) rescue nil
  end
ensure
  $stdin.cooked!
  return input
 end

第 2 版

def read_char
  system("stty raw -echo") 
  input = $stdin.getc.chr
  if input == "\e" then
    input << $stdin.read_nonblock(3) rescue nil
    input << $stdin.read_nonblock(2) rescue nil
  end
ensure
  system("stty -raw echo")  
  return input
end

我对两者都有同样的问题。具体来说,它们修改了 Kernel#system 命令的行为。

举个例子:

system("irb")
c=read_char
system("irb")

很容易看到系统的行为发生了变化,并且在第二个版本中,输入输出不是从 tty 中提取的。

请注意,当您按下任何键时,这不会发生,只是一个被转换为转义序列的键,例如光标键。

那么这是如何修复的呢?

附言

有人建议我在第二个位置运行 system("strace -o logfile irb") 并检查读取语句。相反,我跟踪了两个 irbs 并进行了比较。除了最后一个之外,所有的读取语句都是相同的,而且它们都是如此。最后的阅读看起来不同:

1st system: read(0, "1\n", 1024)                    = 2
2nd system: read(0, 0x7ff805a53000, 1024)           = -1 EAGAIN (Resource temporarily unavailable)

0x7ff805a53000 is the address of a memory mapped region.

聚苯乙烯

我在linux系统上做这个。

4

0 回答 0