[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Detecting control-c?

williamerubin

12/8/2005 7:36:00 PM

How does one detect Control-C?

I know that it raises an Interrupt, but there are other things that are
also Interrupts (such as Timeout::Error). The documentation at
ruby-doc.org doesn't list any details of class Interrupt, and the
"Programming Ruby" book at ruby-lang.org doesn't even seem to mention
that class Interrupt exists.

Thanks.

5 Answers

Berger, Daniel

12/8/2005 7:57:00 PM

0

William E. Rubin wrote:
> How does one detect Control-C?

trap("INT"){ ... }

>
> I know that it raises an Interrupt, but there are other things that are
> also Interrupts (such as Timeout::Error). The documentation at
> ruby-doc.org doesn't list any details of class Interrupt, and the
> "Programming Ruby" book at ruby-lang.org doesn't even seem to mention
> that class Interrupt exists.
>
> Thanks.

Interrupt is a subclass of SignalException (which is a subclass of Exception).
As far as I can tell (based on what I see in eval.c) it's only used for
trapping Unix signals*, i.e. whatever's in your signal.h file.

Also, take a look at the Signal module.

Regards,

Dan

* Works on Windows too, though the implementation is different, and likely
requires a separate sleeper thread.


Joe Van Dyk

12/8/2005 8:04:00 PM

0

On 12/8/05, William E. Rubin <williamerubin@dodgeit.com> wrote:
> How does one detect Control-C?
>
> I know that it raises an Interrupt, but there are other things that are
> also Interrupts (such as Timeout::Error). The documentation at
> ruby-doc.org doesn't list any details of class Interrupt, and the
> "Programming Ruby" book at ruby-lang.org doesn't even seem to mention
> that class Interrupt exists.

hump:[]:/home/mz652c% cat signal.rb

trap("INT") do
puts "got signal INT"
end

puts "Sup"
gets


hump:[]:/home/mz652c% ruby signal.rb
Sup
got signal INT
got signal INT
got signal INT
got signal INT
got signal INT


pressing ctrl-c generates 'got signal INT'. Had to press ctrl-d to
exit the program.


Jim Freeze

12/9/2005 1:50:00 PM

0

On 12/8/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
> trap("INT") do
> puts "got signal INT"
> end
>
> puts "Sup"
> gets
>
> hump:[]:/home/mz652c% ruby signal.rb
> Sup
> got signal INT
> got signal INT

Interesting. When I ran the program above I get:
^Cgot signal INT
....

Any ideas on how to not get the '^C' text?

--
Jim Freeze


Joe Van Dyk

12/9/2005 5:42:00 PM

0

On 12/9/05, Jim Freeze <jim@freeze.org> wrote:
> On 12/8/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
> > trap("INT") do
> > puts "got signal INT"
> > end
> >
> > puts "Sup"
> > gets
> >
> > hump:[]:/home/mz652c% ruby signal.rb
> > Sup
> > got signal INT
> > got signal INT
>
> Interesting. When I ran the program above I get:
> ^Cgot signal INT
> ....
>
> Any ideas on how to not get the '^C' text?

Dunno, I didn't get the '^C' text. (on linux)


Gary Wright

12/9/2005 6:41:00 PM

0


On Dec 9, 2005, at 8:50 AM, Jim Freeze wrote:

> On 12/8/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
>> trap("INT") do
>> puts "got signal INT"
>> end
>>
>> puts "Sup"
>> gets
>>
>> hump:[]:/home/mz652c% ruby signal.rb
>> Sup
>> got signal INT
>> got signal INT
>
> Interesting. When I ran the program above I get:
> ^Cgot signal INT
> ....
>
> Any ideas on how to not get the '^C' text?

The ^C is your ctrl-c being echoed by the
terminal device driver. You can use the stty
program to alter the behavior of the tty driver.
In particular, take a look at the -echoctl
option. In any case, the foreground process (ruby) doesn't
see the ctrl-c because the tty driver discards
it and sends the Interrupt signal instead and then takes
car of echoing '^C' back to the terminal itself.

The specific behavior may also depend on the particular
shell you are using.

Hope this helps.