Режим Raw (stty raw -echo
), к сожалению, заставляет Control-C отправляться как символ, а не как SIGINT. Поэтому, если вы хотите заблокировать ввод, как описано выше, но разрешить пользователю нажимать control-C, чтобы остановить программу во время ожидания, обязательно сделайте следующее:
Signal.trap("INT") do # SIGINT = control-C
exit
end
И если вы хотите неблокирующий ввод - то есть периодически проверяйте, нажал ли пользователь клавишу, а пока, иди, делайте другие вещи - тогда вы можете сделать это:
require 'io/wait'
def char_if_pressed
begin
system("stty raw -echo") # turn raw input on
c = nil
if $stdin.ready?
c = $stdin.getc
end
c.chr if c
ensure
system "stty -raw echo" # turn raw input off
end
end
while true
c = char_if_pressed
puts "[#{c}]" if c
sleep 1
puts "tick"
end
Обратите внимание, что вам не нужен специальный обработчик SIGINT для неблокирующей версии, поскольку tty находится только в режиме raw в течение краткого момента.