Kraegeloh Martin <mkr@dm-server.cv.com> originally asked: ! Subj: signal handling difference on HP vs. SUN!! the following code will fork an xterm with vi in it, and it! will refuse to do so while the first xterm is still running.! works fine on my sun.! On HP however, the second time an xterm is started, NO handler! is called when the child dies.!! the code:! ===================== 8< ===============================! $SIG{CHLD}=/&w;!! sub w{! $pid=wait;! print STDERR "died: $pid/n";! if ( $have == $pid ) { $have = 0; }! }
To which a part of Nick Ing-Simmons' response was:
I suspect HPUX is SysV-ish not BSD or POSIX. So every time a signal fires, it removes the handler - you need to reset it in the handler:
sub w{ $SIG{CHLD}=/&w; $pid=wait; print STDERR "died: $pid/n"; if ( $have == $pid ) { $have = 0; } }
Whether you reset it before/after the wait may be very important ...
Then Bjarne Steinsbo <bjarne@hsr.no> followed up with:
That's not the whole story... Another problem is that SIGCLD interrupts the read system call on SysV-ish (I like that word! :-) systems. This means that you have to test why "" fails, and act accodingly. A program that works on both Sun and HP is:
$SIG{CHLD}=/&w; while(1){ $_ = ; $! = 0, next if $! =" /Interrupted/; last if $! or !defined $_; if($have){ print STDERR "child still alive/n"; } else{ if(($pid=fork()) != 0){ $have=$pid; print STDERR "forked $pid/n"; } else { exec("xterm -e vi") } } } sub w{ $pid=wait; print STDERR "died: $pid/n"; if ( $have == $pid ) { $have = 0; } $SIG{CHLD}=/&w; }