######################################################################
# Process.pm
######################################################################
# Perl Power! - Michael Schilli 1998
######################################################################

package Process;

######################################################################
# $proc_obj=Process->new();          constructor
######################################################################
sub new { 
  bless {};
}

######################################################################
# $ret = $proc_obj->start("prg");    start shell process in background
# $ret = $proc_obj->start(\&func);   start function in background
######################################################################
sub start {
  my ($self, $func) = @_;
                                        
  $SIG{'CHLD'} = sub { wait };            # prevent zombies

  $self->{'pid'} = fork();                # create subprocess 
                                          # with fork
  if(!defined $self->{'pid'}) { 
      return 0;                           # fork error
  } elsif($self->{'pid'} == 0) {          # child process:
      if(ref($func) eq "CODE") {
          &$func; exit 0;                 #   start subroutine
      } else {
          exec "$func";                   # start shell process
      }
  } else {                                # parent process:
      return 1;                           #   return OK
  }
}

######################################################################
# $ret = $proc_obj->poll();          interrogate process status: 
#                                    1="running" 0="not running"
######################################################################
sub poll {
  my $self = shift;

  exists $self->{'pid'} &&                # pid initialized and
    kill(0, $self->{'pid'});              # ... process reacts
}

######################################################################
# $ret = $proc_obj->kill([SIGXXX]);  send signal to process, 
#                                    default parameter: SIGTERM
######################################################################
sub kill { 
  my ($self, $sig) = @_;

  $sig = 'SIGTERM' unless defined $sig;   # if no parameter spec-
                                          # ified => SIGTERM signal

  return 0 if !exists $self->{'pid'};     # process initialized?

  kill($sig, $self->{'pid'}) || return 0; # send signal

  delete $self->{'pid'};                  # delete process variable

  1;                                      # OK
}

1;

