Child signal behaviour on HPUX

Discussion in 'Perl Misc' started by Jorge, Jul 1, 2003.

  1. Jorge

    Jorge Guest

    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::SigAction->new( 'my_handler', $sigset,
    SA_NODEFER);
    my $oldaction = POSIX::SigAction->new;
    my $return;

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

    sigaction(SIGCHLD, $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
    $
     
    Jorge, Jul 1, 2003
    #1
    1. Advertising

  2. (Jorge) wrote in message news:<>...
    > 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.
    >


    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)
    http://cboard.cprogramming.com/show...ae3a96&threadid=8137&highlight=sigqueue linux

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


    > 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.
    >


    If you really want to explore this, you should check with people in
    comp.unix.programmer, etc....

    > I appreciate your suggestions. Thanks in advance.
    >
    > PS: Perl 2.5.1, hpux 11.00


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

    <snip code>
     
    Bryan Castillo, Jul 2, 2003
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jorge
    Replies:
    1
    Views:
    2,810
    Bryan Castillo
    Jul 2, 2003
  2. Jeff Rodriguez
    Replies:
    23
    Views:
    1,200
    David Schwartz
    Dec 9, 2003
  3. Michael Pronath
    Replies:
    1
    Views:
    1,236
    Diez B. Roggisch
    Jan 3, 2005
  4. Jack Orenstein

    threading.Thread vs. signal.signal

    Jack Orenstein, Sep 18, 2005, in forum: Python
    Replies:
    0
    Views:
    497
    Jack Orenstein
    Sep 18, 2005
  5. Weng Tianxiang
    Replies:
    2
    Views:
    688
    Jonathan Bromley
    Jan 30, 2007
Loading...

Share This Page