--- loncom/lonmaxima 2006/03/04 06:44:11 1.8 +++ loncom/lonmaxima 2006/03/04 15:47:26 1.11 @@ -3,7 +3,7 @@ # The LearningOnline Network with CAPA # Connect to MAXIMA CAS # -# $Id: lonmaxima,v 1.8 2006/03/04 06:44:11 albertel Exp $ +# $Id: lonmaxima,v 1.11 2006/03/04 15:47:26 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,8 +52,9 @@ my $pidfile; # my $port; # path to UNIX socket file my %perlvar; # configuration file info my $lastlog; # last string that was logged +my $maximapid; # PID of Maxima process use vars qw($PREFORK $MAX_CLIENTS_PER_CHILD %children $children $status - $pidfile $port %perlvar $lastlog); + $pidfile $port %perlvar $lastlog $maximapid); sub maximareply { my ($cmd) = @_; @@ -64,7 +65,7 @@ sub maximareply { unless ($cmd=~/\;\n$/) { $cmd.=";\n"; } my ($cmd_in, $cmd_out, $cmd_err); - my $maximapid = open3($cmd_in, $cmd_out, $cmd_err, 'maxima'); + $maximapid = open3($cmd_in, $cmd_out, $cmd_err, 'maxima'); $children{$maximapid} = 1; print $cmd_in $cmd; @@ -72,9 +73,8 @@ sub maximareply { &status("Command sent"); - $SIG{ALRM} = sub { kill 9 => $maximapid; }; + $SIG{ALRM} = sub { kill(9 => $maximapid); }; alarm(5); - no strict 'refs'; my $selector = IO::Select->new(); @@ -82,7 +82,9 @@ sub maximareply { while (my @ready = $selector->can_read()) { foreach my $fh (@ready) { - if (fileno($fh) == fileno($cmd_err)) { + if (ref($fh) + && ref($cmd_err) + && fileno($fh) == fileno($cmd_err)) { $error.=<$cmd_err>; } else { my $line = scalar(<$cmd_out>); @@ -96,9 +98,9 @@ sub maximareply { } alarm(0); $SIG{ALRM} = 'DEFAULT'; - close($cmd_out); - close($cmd_err); - use strict 'refs'; + if (ref($cmd_out)) { close($cmd_out); } + if (ref($cmd_err)) { close($cmd_err); } + &status("Command processed"); return ($reply,$error,$exitstatus); } @@ -247,15 +249,15 @@ close(PIDSAVE); &status('Starting'); +# Install signal handlers. +$SIG{CHLD} = \&REAPER; +$SIG{INT} = $SIG{TERM} = \&HUNTSMAN; + # Fork off our children. for (1 .. $PREFORK) { &make_new_child($server); } -# Install signal handlers. -$SIG{CHLD} = \&REAPER; -$SIG{INT} = $SIG{TERM} = \&HUNTSMAN; - # And maintain the population. while (1) { &status('Parent process, sleeping');