Child signal behaviour on HPUX

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jorge

    Child signal behaviour on HPUX

    All,

    I've got a process that creates some children and want to be alerted
    when they die. To do this, the SIGCHLD signal is registered in the
    process using sigaction to jump to a subprogram as soon as it's
    received.

    The problem comes when many children exit at the same time and their
    father seems to miss some of them. This happens quite often, but not
    always.

    Why are the signals being missed? I'm pretty sure it's something with
    the flags on sigaction, but I've tryed several options and it's always
    the same.

    I appreciate your suggestions. Thanks in advance.

    PS: Perl 2.5.1, hpux 11.00

    CODE----------------

    #!/bin/env perl

    use strict;
    use POSIX;

    # empty set
    my $sigset = POSIX::SigSet->new;

    # sigaction structure
    my $newaction = POSIX::SigActio n->new( 'my_handler', $sigset,
    SA_NODEFER);
    my $oldaction = POSIX::SigActio n->new;
    my $return;

    sub my_handler
    {
    my($sig) = @_;
    my($hpid) = wait();
    $return = POSIX::WEXITSTA TUS($?);
    print "Im $$. Caught a SIG$sig from $hpid returning $return\n";
    sleep(10);
    print "Ending handler of $hpid\n";
    }

    sigaction(SIGCH LD, $newaction, $oldaction);

    if (!fork())
    {
    print "Im $$ sleeping 3 s\n";
    sleep(3);
    print "Im $$ returning 7\n";
    exit(7);
    }
    if (!fork())
    {
    print "Im $$ sleeping 3 s\n";
    sleep(3);
    print "Im $$ returning 7\n";
    exit(7);
    }
    if (!fork())
    {
    print "Im $$ sleeping 3 s\n";
    sleep(3);
    print "Im $$ returning 7\n";
    exit(7);
    }
    if (!fork())
    {
    print "Im $$ sleeping 3 s\n";
    sleep(3);
    print "Im $$ returning 7\n";
    exit(7);
    }
    if (!fork())
    {
    print "Im $$ sleeping 3 s\n";
    sleep(3);
    print "Im $$ returning 7\n";
    exit(7);
    }
    print "Im father process $$\n";
    sleep(20);
    exit(0);

    SOME CUT&PASTE FROM THE TERM---------- as you can see only 4 signals
    out of 5 are detected

    $ dwmanager_v4_en .pl
    Im 6406 sleeping 3 s
    Im 6407 sleeping 3 s
    Im 6408 sleeping 3 s
    Im 6409 sleeping 3 s
    Im father process 6405
    Im 6410 sleeping 3 s
    Im 6406 returning 7
    Im 6405. Caught a SIGCHLD from 6406 returning 7
    Im 6408 returning 7
    Im 6407 returning 7
    Im 6409 returning 7
    Im 6405. Caught a SIGCHLD from 6409 returning 7
    Im 6410 returning 7
    Im 6405. Caught a SIGCHLD from 6408 returning 7
    Im 6405. Caught a SIGCHLD from 6410 returning 7
    Ending handler of 6410
    Ending handler of 6408
    Ending handler of 6409
    Ending handler of 6406
    $
  • Bryan Castillo

    #2
    Re: Child signal behaviour on HPUX

    jom_es@yahoo.es (Jorge) wrote in message news:<f580ae77. 0307010438.3271 371f@posting.go ogle.com>...[color=blue]
    > All,
    >
    > I've got a process that creates some children and want to be alerted
    > when they die. To do this, the SIGCHLD signal is registered in the
    > process using sigaction to jump to a subprogram as soon as it's
    > received.
    >
    > The problem comes when many children exit at the same time and their
    > father seems to miss some of them. This happens quite often, but not
    > always.
    >[/color]

    I noticed this problem on linux using the sigqueue function. I was
    writing
    in C. On Solaris, I never missed signals.

    I don't think you can consider signals reliable. Some of them
    will be dropped. I went looking through the linux source a while ago
    trying to figure out why. It looked like the kernel would skip
    delivering a signal if the task struct for the process already had
    that same signal marked for delivery on the process. So, if 2 signals
    were delivered before the first was handled, the process would only
    know
    1 signal was delivered. Perhpas HPUX is similar.

    Here is a thread where I was writing about this:
    (I don't think I explained it too well then and I still dont know if I
    was
    right)


    You might want to do periodic checks of the pids you know you started,
    using the non-blocking version of waitpid.

    [color=blue]
    > Why are the signals being missed? I'm pretty sure it's something with
    > the flags on sigaction, but I've tryed several options and it's always
    > the same.
    >[/color]

    If you really want to explore this, you should check with people in
    comp.unix.progr ammer, etc....
    [color=blue]
    > I appreciate your suggestions. Thanks in advance.
    >
    > PS: Perl 2.5.1, hpux 11.00[/color]

    You are joking about perl 2.5.1 right? How old would that be?

    <snip code>

    Comment

    Working...