I am reading an excellent book by Jesse Storymer, Working with Unix Processes . In the section on capturing signals from child processes that came out, he gives a code sample.
I modified this code a bit (see below) to get more noticeable information about what is happening:
- That the parent resumes its own execution between the signals (which I see with
puts ), wait for multiple children in the same trap expression (sometimes I get a "Received CHLD signal", followed by several "child pid").
Expected Result
Typically, the output from the code below looks something like this:
parent is working hard Received a CHLD signal child pid 73408 exited parent is working hard parent is working hard parent is working hard Received a CHLD signal child pid 73410 exited child pid 73409 exited All children exited - parent exiting too.
Periodic error
But from time to time I get this error:
trapping_signals.rb:17:in `write': deadlock; recursive locking (ThreadError) from trapping_signals.rb:17:in `puts' from trapping_signals.rb:17:in `puts' from trapping_signals.rb:17:in `block in <main>' from trapping_signals.rb:17:in `call' from trapping_signals.rb:17:in `write' from trapping_signals.rb:17:in `puts' from trapping_signals.rb:17:in `puts' from trapping_signals.rb:17:in `block in <main>' from trapping_signals.rb:40:in `call' from trapping_signals.rb:40:in `sleep' from trapping_signals.rb:40:in `block in <main>' from trapping_signals.rb:38:in `loop' from trapping_signals.rb:38:in `<main>
Can someone explain to me what is going wrong here?
The code
child_processes = 3 dead_processes = 0
multithreading ruby signals deadlock fork
Nathan long
source share