package Process;
######################################################################
# (c) Michael Schilli 1999
######################################################################

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

###############################################################
# $ret = $proc_obj->start("prg");  Shell-Prozeß im 
#                                  Hintergrund starten
# $ret = $proc_obj->start(\&func); Funktion im Hintergrund 
#                                  starten
###############################################################
sub start {
  my ($self, $func) = @_;
                                        
  $SIG{'CHLD'} = sub { wait };         # Zombies verhindern

  $self->{'pid'} = fork();             # Subprozeß mit fork 
                                       # erzeugen
  if(!defined $self->{'pid'}) { 
      return 0;                        # Forkfehler
  } elsif($self->{'pid'} == 0) {       # Child-Prozeß:
      if(ref($func) eq "CODE") {
          &$func; exit 0;              #   Subroutine starten
      } else {
          exec "$func";                #   Shell-Prozeß starten
      }
  } else {                             # Parent-Prozeß:
      return 1;                        #   OK zurückgeben
  }
}

###############################################################
# $ret = $proc_obj->poll();   Prozeßstatus abfragen: 
#                             1="läuft" 0="läuft nicht"
###############################################################
sub poll {
  my $self = shift;

  exists $self->{'pid'} &&             # pid initialisiert und
    kill(0, $self->{'pid'});           # ... Prozeß reagiert
}




###############################################################
# $ret = $proc_obj->kill([SIGXXX]);  Signal an Prozeß schicken, 
#                                    Default-Parameter: SIGTERM
###############################################################
sub kill { 
  my ($self, $sig) = @_;

  $sig = 'SIGTERM' unless defined $sig;  # Falls kein Parameter 
                                         # spezifiziert => 
                                         # SIGTERM-Signal

  return 0 if !exists $self->{'pid'}; # Prozeß initialisiert?

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

  delete $self->{'pid'};              # Prozeß-Variable löschen

  1;                                  # OK
}

1;
