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

**URL:** <https://www.ruby-forum.com/t/proper-way-to-allow-control-c-to-interrupt-io-gets/128917>\
**Category:** Ruby\
**Created:** [February 12, 2008, 5:30pm UTC](https://www.ruby-forum.com/t/proper-way-to-allow-control-c-to-interrupt-io-gets/128917 "2008-02-12T17:30:47Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Lloyd\_Z](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/50afbb/32.png) [@Lloyd\_Z](https://www.ruby-forum.com/u/Lloyd_Z)\
**Post date:** [February 12, 2008, 5:30pm UTC](https://www.ruby-forum.com/t/proper-way-to-allow-control-c-to-interrupt-io-gets/128917/1 "2008-02-12T17:30:47Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Lloyd\_Z](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/50afbb/32.png) [@Lloyd\_Z](https://www.ruby-forum.com/u/Lloyd_Z)\
**Post date:** [February 12, 2008, 5:47pm UTC](https://www.ruby-forum.com/t/proper-way-to-allow-control-c-to-interrupt-io-gets/128917/2 "2008-02-12T17:47:57Z")

</div>

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 Z. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:
