Forum: Ruby Detecting control-c?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
williamerubin (Guest)
on 2005-12-08 21:41
(Received via mailing list)
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.
Daniel.Berger (Guest)
on 2005-12-08 21:57
(Received via mailing list)
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.
joevandyk (Guest)
on 2005-12-08 22:05
(Received via mailing list)
On 12/8/05, William E. Rubin <removed_email_address@domain.invalid> 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 (Guest)
on 2005-12-09 15:50
(Received via mailing list)
On 12/8/05, Joe Van D. <removed_email_address@domain.invalid> wrote:
> 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?
joevandyk (Guest)
on 2005-12-09 19:43
(Received via mailing list)
On 12/9/05, Jim F. <removed_email_address@domain.invalid> wrote:
> > 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)
gwtmp01 (Guest)
on 2005-12-09 20:44
(Received via mailing list)
On Dec 9, 2005, at 8:50 AM, Jim F. wrote:

>> 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.
This topic is locked and can not be replied to.