[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: TCPSocket hangs after ctrl-c

e

1/16/2005 5:17:00 PM

> Lähettäjä: Bjarke Bruun <bbj@swooplinux.org>
> Aihe: Re: TCPSocket hangs after ctrl-c
>
> On Sunday 16 January 2005 16:03, ts wrote:
> > >>>>> "B" == Bjarke Bruun <bbj@swooplinux.org> writes:
> >
> > B> fork {
> >
> > Why you don't use a thread, with a block local variable for @s
>
> This is just a "test" for me. It's not (yet anyway) in progress of
> beeing published... the rfc is large for startes, but the fork, IMHO,
> has less footprint than threads and threads in ruby are only threads
> inside the ruby process so the difference is the same until Matz et.
> al. implements native threads for ruby (which I'm waiting for :-))
>
> The problem is not the local socket that is talking to the client it's
> the main socket that hangs if I don't use "kill -9" and I would like to
> find a way to fix that... "E S" has a point, but I'm new to Ruby and
> don't quite know where to get info on usage of the
> Signal#trap and Process#abort right now. Always glad to learn more but
> from scratch is hard, if you remember :-)

http://www.rub... is your friend :) Look for Process and
Signal in the Core API.

You could do something like this (use whatever signals):

# ...
def initialize
# ...
Signal.trap "TERM" do
puts "Bringing #{$0} down..."
shutdown
puts "...down."
end

@child = fork do
# Propagated
Signal.trap "TERM" do
# Shutdown procedures, finish read etc.
puts "...reader terminated..."
end
# ...
end

def shutdown
# Send a signal to the child
Process.kill "TERM", @child
Process.wait @child
puts "...main process terminated..."
end

> I'm looking for something like this
>
> $ ./rsmtp.rb # the name of the server script
>
> and then be able to press <ctrl-c> without having the socket hanging for
> some 30 seconds before I can start the script again. I had a similar
> experience in school a long time ago in C++ but I can't remember the
> code I wrote back then to overcome this problem... and I don't have the
> code anymore FYI.
>
> I'm looking in "Programming Ruby: The Progmatic Programmer's Guide" with
> no luck as to set up a trap for the script if it receives (SIG)KILL
> signal - where to look?

E