Proper way to allow Control-C to interrupt IO#gets

What is the canonical method for allowing an IO#gets call to be
immediately interrupted by Control-C? This doesn't seem to work as I am
expecting. Consider the following bit of ruby code:

  trap("INT") do
    puts "got signal INT"
  end
  puts "Enter some characters followed by newline:"
  result = gets
  puts result

When I run this and enter a few characters interspersed with an instance
of Control-C, the Control-C doesn't get recognized until after I hit
newline. Assuming that this program is in a file called "cctest",
here's what happens:

  % ruby cctest
  Enter some characters followed by newline:
  [ here I enter AB^CDEFG, where "^C" is Control-C, which
    doesn't cause the input to be aborted ]
  ABDEFG <- This is what echos when I'm typing.
  got signal INT <- This is what echos after I hit newline,
  DEFG <- ... and this, as well.

In other words, the SIGINT resulting from Control-C doesn't get
processed at until after I type the newline.

I've searched for discussions of this on the net, but I haven't found
anything under a "ruby interrupt gets" Google search, because the word
"gets" is used so commonly in English in so many other contexts.

I know that I can write my own input handler or use something like the
HighLine package, but I'm wondering whether there's a way to cause
IO#gets to do what I want.

By the way, in case this is pertinent ...

  % ruby --version
  ruby 1.8.5 (2006-12-25 patchlevel 12) [i686-linux]

  % uname -mor
  2.6.9-022stab078.20-enterprise i686 GNU/Linux

Thanks in advance.

···

--
Lloyd Zusman
ljz@asfast.com
God bless you.

I left out a "Kernel.exit(0)" call in my test, but I still have the same
problemL

  trap("INT") do
    puts "got signal INT"
    Kernel.exit(0)
  end
  puts "Enter some characters followed by newline:"
  result = gets
  puts result

  % ruby cctest
  Enter some characters followed by newline:
  [ here I enter AB^CDEFG, where "^C" is Control-C, which
    doesn't cause the input to be aborted ]
  ABDEFG <- This is what echos when I'm typing.
  got signal INT <- This is what echos after I hit newline.

In other words, the SIGINT still doesn't get processed until
after the newline is entered.

Lloyd Zusman <ljz@asfast.com> writes:

···

What is the canonical method for allowing an IO#gets call to be
immediately interrupted by Control-C? This doesn't seem to work as I am
expecting. Consider the following bit of ruby code:

  trap("INT") do
    puts "got signal INT"
  end
  puts "Enter some characters followed by newline:"
  result = gets
  puts result

When I run this and enter a few characters interspersed with an instance
of Control-C, the Control-C doesn't get recognized until after I hit
newline. Assuming that this program is in a file called "cctest",
here's what happens:

  % ruby cctest
  Enter some characters followed by newline:
  [ here I enter AB^CDEFG, where "^C" is Control-C, which
    doesn't cause the input to be aborted ]
  ABDEFG <- This is what echos when I'm typing.
  got signal INT <- This is what echos after I hit newline,
  DEFG <- ... and this, as well.

In other words, the SIGINT resulting from Control-C doesn't get
processed at until after I type the newline.

I've searched for discussions of this on the net, but I haven't found
anything under a "ruby interrupt gets" Google search, because the word
"gets" is used so commonly in English in so many other contexts.

I know that I can write my own input handler or use something like the
HighLine package, but I'm wondering whether there's a way to cause
IO#gets to do what I want.

By the way, in case this is pertinent ...

  % ruby --version
  ruby 1.8.5 (2006-12-25 patchlevel 12) [i686-linux]

  % uname -mor
  2.6.9-022stab078.20-enterprise i686 GNU/Linux

Thanks in advance.

--
Lloyd Zusman
ljz@asfast.com
God bless you.

--
Lloyd Zusman
ljz@asfast.com
God bless you.