It sounds as if you need a child to do the parent's blocking tasks. The parent should be a controller or do it's own work, but preferably not both. Can you not move the parent's work into a child process? Then you would be able to monitor all children and separate your concerns.
What you could possibly do (and I don't know if there's any guarantees on this) is capture the parent pid in a variable before forking, then make an SIG{__DIE__} block that signals the parent PID with a HUP or something similar. Kludgey at best though =/