It took me a while to find out that LWP alarm() collides with the itimer. The reason for that behaviour was already clear.
Until now I do the killing of non-responding childs in the external watchdog, the files used for monitoring contain the pid of the corresponding process.
Solution #2 looks promising and I will look into that a bit further.