From: Nate Murray Date: 2006-11-21T06:25:11+09:00 Subject: Re: fork, trap and exec. Pickaxe typo? This is so strange. I feel that I am really missing something here. Here is my updated code, but the output is odd: require 'pp' trap("CLD") { pid = Process.wait puts "Child pid #{pid}: terminated" } 1.upto(4) do fork do exec("sleep 3 && echo \"hello $HOSTNAME #{Process.pid}\n\"") end end pp Process.waitall == output: hello nate.cpo 4655 Child pid 4655: terminated hello nate.cpo 4660 hello nate.cpo 4657 hello nate.cpo 4659 Child pid 4660: terminated [[4659, #], [4657, #]] The processes that are trapped call the callback and never end up in Process.waitall. And those in Process.waitall never send the SIGCLD. I think I need to do more research on this... Hugh Sasse wrote: > On Tue, 21 Nov 2006, Nate Murray wrote: > > > Yeah, but how do I wait for an unknown amount of time? It would seem > > that this would do it: > > > > trap("CLD") { > > pid = Process.wait > > puts "Child pid #{pid}: terminated" > > } > > > > 1.upto(4) do > > fork do > > exec("sleep 3 && echo \"hello $HOSTNAME #{Process.pid}\n\"") > > end > > end > > > > Process.waitall > > puts Process.waitall > > =begin ri_output > ------------------------------------------------------- Process::waitall > Process.waitall => [ [pid1,status1], ...] > ------------------------------------------------------------------------ > Waits for all children, returning an array of _pid_/_status_ pairs > (where _status_ is a +Process::Status+ object). > [...] > =end > > # So while I'm not sure what's happening to the missing signal > # you should be able to see that all the processes have finished. > > > > But trap isnt always called on all the children. > > > > > Example output: > > > [...] > > Notice that 4137 never called the trap callback even though > > Process.waitall was called. > > > Hugh