Re: Ruby and capturing ^C

Umm, I guess my searching was just plain bad. Thanks for being kind to
me though. Mucho gracias.

Phy

----- Original Message ----
From: Logan C. [email protected]
To: ruby-talk ML [email protected]
Sent: Wednesday, April 4, 2007 10:47:20 PM
Subject: Re: Ruby and capturing ^C

On 4/5/07, Phy P. [email protected] wrote:

Hello!

Is there any way to capture or “trap” ^C within Ruby? Something similar to shell “trapping” is what I am after so that I can do clean up in the event ^C is pressed.

TIA!
Phy

It’s one thing when you don’t know what to search for, but did you even
try?
http://www.google.com/search?hl=en&q=ruby+trap&btnG=Google+Search

How can I remove such a trapping from a program?

I’m running autotest through a rake task. Autotest uses ^C to
restart the tests, rake uses it to cancel the task at hand.

What would be the best way to remove this trap from rake?

Best,

Scott T.

On Thursday 05 April 2007, Scott T. wrote:

How can I remove such a trapping from a program?

I’m running autotest through a rake task. Autotest uses ^C to
restart the tests, rake uses it to cancel the task at hand.

What would be the best way to remove this trap from rake?
Under Posix, you would have to use sigmask(). I don’t think there is a
ruby
equivalent though …

Note that ^C is already trapped by the interpreter, which raises
Interrupt …

Scott T. wrote:

How can I remove such a trapping from a program?

I’m running autotest through a rake task. Autotest uses ^C to restart
the tests, rake uses it to cancel the task at hand.

What would be the best way to remove this trap from rake?

I don’t know if this will help without hacking into rake or autotest,
but you can save and restore the handler. The return value of #trap is
the previous handler, which is just a proc object:

irb(main):001:0> oldh = trap(“INT”) {puts “newh”}
=> #Proc:0x02b2ac30@c:/ruby/lib/ruby/1.8/irb.rb:65
irb(main):002:0> ### <-- I pressed ^C and Enter here
newh
irb(main):003:0*
irb(main):004:0* newh = trap(“INT”, &oldh)
=> #Proc:0x02e14428@:1(irb)
irb(main):005:0>
^C

There is also a useful special case. If you pass “DEFAULT” as the
handler, you go back to ruby’s default (which is different from irb’s
handler):

irb(main):001:0> trap(“INT”, “DEFAULT”)
=> #Proc:0x02b2ac30@c:/ruby/lib/ruby/1.8/irb.rb:65
irb(main):002:0> ### <-- I pressed ^C and Enter here
c:/ruby/lib/ruby/1.8/irb/input-method.rb:97:in gets': Interrupt from c:/ruby/lib/ruby/1.8/irb.rb:132:ineval_input’
from c:/ruby/lib/ruby/1.8/irb.rb:259:in signal_status' from c:/ruby/lib/ruby/1.8/irb.rb:131:ineval_input’
from c:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:189:in call' from c:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:189:inbuf_input’
from c:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:104:in getc' from c:/ruby/lib/ruby/1.8/irb/slex.rb:206:inmatch_io’
from c:/ruby/lib/ruby/1.8/irb/slex.rb:76:in match' ... 8 levels... from c:/ruby/lib/ruby/1.8/irb.rb:70:instart’
from c:/ruby/lib/ruby/1.8/irb.rb:69:in catch' from c:/ruby/lib/ruby/1.8/irb.rb:69:instart’
from c:/ruby/bin/irb.bat:20
Terminate batch job (Y/N)? y