Useful at_exit idiom

i'm constantly struggling with the fact that children need to use exit! to
prevent exit handlers registered in the parent being called twice, for example:

   harp:~ > cat a.rb
   at_exit{ puts 'parent' }

   fork{
     at_exit{ puts 'child' }
   } and Process.wait

   harp:~ > ruby a.rb
   child
   parent

arggh. this is a neat work-around:

   harp:~ > cat a.rb
   at_exit{ puts 'parent' }

   fork{
     at_exit{ exit! }
     at_exit{ puts 'child' }
   } and Process.wait

   harp:~ > ruby a.rb
   child
   parent

i'm sure i'm not the first one to think of this, but it sure is handy to
separate the parent's handlers from the child's... anyone see issues with
this?

-a

···

--
my religion is very simple. my religion is kindness. -- the dalai lama

Hi,

i'm constantly struggling with the fact that children need to use exit! to
prevent exit handlers registered in the parent being called twice,

i'm sure i'm not the first one to think of this, but it sure is handy to
separate the parent's handlers from the child's... anyone see issues with
this?

linux man atexit(3) says:

      When a child process is created via fork(), it inherits copies
      of the its parents registrations. Upon a successful call to one
      of the exec() functions, all registrations are removed.

so I think this is expected behavior for most of the cases, since Ruby
inherits many behaviors from C libraries.

              matz.

···

In message "Re: useful at_exit idiom" on Tue, 10 Oct 2006 13:21:21 +0900, ara.t.howard@noaa.gov writes: