#!/usr/bin/perl -w
use strict;
use warnings;

# ----- // FORKING // -------------------------
{

   # fork-o-rama!
   my($pid) = fork; ++$|;

   die(qq[I ($$) Can't fork $!\012\012]) if (!defined($pid));

   if (!$pid) {

      # AM CHILD PROC
      # handle whatever task you want, then exit...

      exit; # ALWAYS DO THIS!
   }
   else {

      # AM PARENT PROC
      # wait on the child proccess

      waitpid( $pid, 0 );
   }
}
# ----- // DONE FORKING // --------------------


=PROC EVENT HANDLERS.
Use this code if you want to see track proccess creation and termination.

   BEGIN { print(qq[\n\nproc $$ beginning now.\n\n]) }
   END { print(qq[\n\nproc $$ exiting now.\n\n]) }

=cut

=PROC SIGNAL HANDLERS
Use this code if you want to track system sinals while forking.

   BEGIN {

     foreach (keys(%SIG)) {

        my($key) = $_;

        $SIG{$key} = sub {

           $key = '??' unless (defined($key) and length($key));

           warn(scalar(localtime), qq[ -- Got SIG $key\012])
        }
     }

     undef($!)
   }

=cut

=INTERNAL LOGGING. redirects STDERR to a log
Use this code if you want STDERR directed to a private log

   BEGIN { local(*EL); open(EL,'>>./error.log') and open(STDERR,'>&EL') }

=cut

=THERE'S MORE THAN ONE WAY TO waitpid()

   NORMAL WAY TO USE waitpid()
      waitpid( $pid, 0 ) and print(qq[ done waiting on $pid.]);

   NO HANG WAY TO USE waitpid()
      use POSIX qw( :sys_wait_h );
      waitpid( $pid, &POSIX::WNOHANG() ) and print(qq[ done waiting on $pid.]);

=cut