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;