#!/usr/bin/perl use strict; use warnings; # exportiert (unter anderem) die funktion: WNOHANG use POSIX ':sys_wait_h'; # Signalhanler einrichten # Die hier gespeicherte Funktionsreferenz wird aufgerufen, # wenn ein kindprozess Kindpozess beendet wurde $SIG{CHLD}=\&on_sig_child; # drei Prozesse erzeugen for(0..2) { create_child(); sleep 1; } # ein Prozess erzeugen den wir "killen" werden: my $killpid=create_child(); sleep 1; # prozess hart beeneden: kill(9, $killpid) if($killpid); # so lange Schleifendurchlauf wie noch KindProzesse laufen; sleep 1 while(waitpid(-1,WNOHANG())!= -1); exit(); ################## ### Funktionen ######################################################### ################## # Kindprozess erzeugen sub create_child { # KindProzess erzeugen, # indem der eigenen Prozess dubliziert wird. my $pid=fork; # wenn pid definiert und != 0 # wir sind im Elternprozess if($pid) { print "CREATE CHILD($pid)\n"; } # pid definiert und 0 # wir sinb im Kindprozess elsif(defined($pid)) { $SIG{CHLD}='IGNORE'; child_working(); } # pid nicht definiert # ein Fehler ist aufgetreten else { warn "fork faild ($!)\n"; } return $pid; } # der SignalHandler sub on_sig_child { # Welcher KindProzess wurde beendet? my $pid=wait(); # Eine Meldung machen: print "EXIT CHILD: $pid\n"; # Der Wert der mit "exit" zurück geliefert wurde print " CODE: ".($?>>8)."\n"; # Wie wurde der Prozess bendet 0=ohne externes Signal; # Andere Werte siehe "man signal" print " SIGNAL: ".($?&127)."\n"; } sub child_working { # ein wenig schlafen sleep(7); # einen zufällgen Exitstatus zwishen 0 und 4 erzeugen my $exitstatus=int(rand(5)); print "Child($$) exit($exitstatus)\n"; exit($exitstatus); }