#!/usr/bin/perl -w # Skript Name: test1.pl # Parameter: Aktionstyp = Prozess use strict; use warnings; use CGI; use Fcntl qw(:flock); $| = 1; my $cgi = CGI->new; my $url = 'http://server/cgi-bin/test1.pl'; #print "Content-type: text/html \n\n"; #print $cgi->param('Aktionstyp'); # Aufteilen in zwei Subroutinen my $merker = $cgi->param('Aktionstyp') || 'Anzeigen'; if ($merker eq 'Anzeigen') { show($cgi); } elsif ($merker eq 'Prozess') { create($cgi); } # Erstellen des Prozesses und Redirect auf neue Seite sub create { my ($cgi) = @_; my $id = time() . $$; my $filename = "prozess.id$id"; $SIG{CHLD} = 'IGNORE'; if (my $pid = fork) { print $cgi->redirect("$url?Aktionstyp=Anzeigen;id=$id"); # Ende des Parent Prozesses exit; } else { # Beginn Anlegen der Datei open my $fh, ">", $filename; flock $fh, LOCK_EX; close STDOUT; close STDERR; close STDIN; # Erstmal Warten (soll den Prozess simulieren) sleep 10; close $fh; # Ende Anlegen der Datei # Ende des Child Prozesses exit; } } # Anzeigen des Ergebnisses, wenn ChildProzess fertig sub show { my ($cgi) = @_; my $id = $cgi->param('id') || ''; print $cgi->header; print $cgi->start_html; my $filename = "prozess.id$id"; my $meta = $cgi->start_html( my $meta_refresh = -head => $cgi->meta( { -http_equiv => 'refresh', -content => "2; $url?w=show;id=$id", } )); if (open my $fh, "<", $filename) { my $lock = flock $fh, LOCK_EX|LOCK_NB; if ($lock) { print 'Fertig!'; } else { print $meta; print 'Datei noch nicht freigegeben'; } } else { print $meta; print 'Datei ist noch nicht da'; } print $cgi->end_html; }