Robert Klemme
3/3/2008 8:26:00 PM
2008/3/3, Oliver Peng <oliver.peng@skywave.com>:
> Robert Klemme wrote:
> > You are doing an unhealthy mix: Process.waitall and wait block to wait
> > for an event but SIGCLD is supposed to be called when that event
> > happens.
> >
> > So either, use Process.waitall in main or change the trap code to do
> > something like manipulating a child process counter so you can detect
> > when the last is gone.
>
> Sorry. I am not sure what do you mean. In my code, it trap the CLD
> signal to run wait method to clean the zombie sub-process, which is same
> as the sample code in book 'Programming ruby'.
There is no trace of Process.waitall in the signal handler sample code.
> When a child process dies, a signal, SIGCHLD (or SIGCLD) is sent to its
> parent process. So when I run Process.wait, I always should get the
> response at once. And this code can work. The only problem is sometimes
> SystemStackError was raised.
>
> Can you please use sample code to show me where is the problem?
The problem is in waitall. The sample code otherwise works ok. Try this
trap "CLD" do
puts "#{Process.wait} exited"
# alternative
p Process.wait2
end
5.times do |i|
pid = fork do
puts "proc #{i}"
end and puts "#{pid} created"
end
puts "all children created"
sleep 10
Here's another approach
require 'pp'
5.times do |i|
pid = fork do
puts "proc #{i}"
end and puts "#{pid} created"
end
puts "all children created"
pp Process.waitall
Kind regards
robert
--
use.inject do |as, often| as.you_can - without end