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; }
Previous | Return to table of contents | Next