Nate Murray
11/20/2006 9:21:00 PM
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, #<Process::Status: pid=4659,exited(0)>],
[4657, #<Process::Status: pid=4657,exited(0)>]]
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