Hi Chad.

Chad Kellerman wrote:
> Hello,
>
>    Got a little issue.  Tyring ot under stand how things work but just not
> getting it.  I am forking each element of the array .  I have a maximum child
> count of 8.  Which works.  What I was wondering is if I get into the if
> statement in the until loop.  How do I exit the pid clean up and go on to the
> next element in the array with out leaving any pids around?
>
> FORK:
>         {
>
>     HOSTID2: foreach $hostId ( @hostIds ) {
>
> #next if $CHILD_PIDS > $MAX_CHILDREN;
> redo HOSTID2 if $CHILD_PIDS >= $MAX_CHILDREN;
>
>   if( my $pid = fork ) {
>     $CHILD_PIDS++;     #Add the children up until we hit the max
>                     next;
> }elsif (defined $pid) {
>                     my $failures = 0;
>
>             #grab quota for each user and insert into the database
>             until ( (BACKUP->QuotaIt( $hostId, $mysqluser, $mysqlpasswd ) or
> ( $failures == $maxtries ) ) ) {
>                 $failures++;
>                 if ( $failures == $maxtries ) {
>                             #BLA BLA code
>
>     #clean up the pid and exit
>                             exit 0;
>                             waitpid(-1, &WNOHANG);
>
>             #go to the next hostid
>             next HOSTID2;
>
>         } #if statememt
>
>             } #until statement
>
> #rest of code.
>
> Thanks for the help,

You'd do yourself a favour if you laid out your code better with
blocks indented neatly. It's very hard to see the loop structure
as it is.

You seem to be getting confused over which process your code is
executing in. You're doing a waitpid from your child processes,
for instance, and looping on the host ID in all the processes.

Take a look at the following. It almost certainly won't work as it
is, because I'm not sure of the sense of some of your tests, but it's
written without using loop labels, which are often a sign of something
going wrong. It's rarely necessary to label your loops unless you're
doing something quite tricky.

Let us know if this helps.

Rob


    my $child_pids = 0;

    foreach $hostId ( @hostIds ) {

        my $pid = undef;

        $pid = fork if $child_pids < $MAX_CHILDREN;

        if ($pid > 0) {

            $child_pids++;

        } elsif ( defined $pid ) {

            # $pid == 0 so in the child process

            my $failures = 0;

            while ( $failures < $maxtries ) {
                my $result = BACKUP->QuotaIt ( $hostId, $mysqluser, $mysqlpasswd );
                last if $result;
                $failures++;
            }

            #BLA BLA code
            #clean up the pid and exit

            exit 0;

        } else {

            # $pid is undefined so fork failed - wait for a spare one

            waitpid -1, WNOHANG;
            $child_pids--;
        }
    }





-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to