Hopefully this group of code snips will show you what is going on.
The first part is where I create the fork.
The second part is the lengthy process (one of them).
The third part is how I display the results so far as processing is ongoing.
It works fine, except it waits until createCommandFiles() is done before displaying the results instead of displaying the results so far.
my $session = getSessionID();
my $cache = getCacheHandle();
$cache->set($session, [0, $buffer]);
#===== Fork off a child process to do the processing
if (my $pid = fork)
{
delete_all(); # get rid of old parameters
param('session', $session);
print redirect(self_url());
}
elsif (defined($pid))
{
close STDOUT;
open (STDOUT, "-|");
#===== Make the command files
$buffer .= "<strong>Creating command files...</strong><br>";
$cache->set($session, [0, $buffer]);
createCommandFiles($cache);
$buffer .= "<strong>Done creating command files.</strong><p>";
$cache->set($session, [1, $buffer]);
} # if the pid is defined
sub createCommandFiles($)
{
my $cache = shift or
die "Must supply cache to getVersionReports()!\n";
#===== Change directory to our directory
chdir($file_dir) or die "Couldn't chdir to $file_dir";
#===== Make each command file
foreach my $device (@selected_devices_array)
{
my $command = "$mkcmdfile -t \"$device\"";
system($command) and die
"Could not run command $command : $!";
$buffer .= "Created command file for $device.<br>";
#===== Update the display cache
$cache->set($session, [0, $buffer]);
}
} # end of createCommandFiles()
#===================================================================
# D I S P L A Y R E S U L T S
#===================================================================
sub displayPushResults($)
{
my $session = shift or
die "Must supply session id to displayPushResults()!\n";
my $cache = undef;
my $data = undef;
#===== Get a cache handle
$cache = getCacheHandle();
#===== Get the session info
$data = $cache->get($session);
#===== Check validity of session
die "Could not reconnect to your session!\n" unless ($data and ref $
+data eq 'ARRAY');
#===== Write the header
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>CodePusher.cgi</title>\n";
print "<meta http-equiv=refresh content=5>\n" if (!($data->[0]));
print "</head>\n";
print "<body>\n";
AantsHtml::printUWHeader();
#===== Title
print "<center><h1>Results</h1></center>\n";
print "<p><p>\n";
#===== Print the results
print "$data->[1]";
if (!$data->[0])
{
print "<p><font color=red>Still processing... please wait!</font><
+br>";
} # if the code push is not done yet
} # displayPushResults()
CT
Charles Thomas
Madison, WI