--- loncom/lonmaxima 2006/03/04 02:33:54 1.7 +++ loncom/lonmaxima 2006/03/04 06:56:10 1.10 @@ -3,7 +3,7 @@ # The LearningOnline Network with CAPA # Connect to MAXIMA CAS # -# $Id: lonmaxima,v 1.7 2006/03/04 02:33:54 www Exp $ +# $Id: lonmaxima,v 1.10 2006/03/04 06:56:10 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,10 +52,8 @@ 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 -my $selector; # open3's selector use vars qw($PREFORK $MAX_CLIENTS_PER_CHILD %children $children $status - $pidfile $port %perlvar $lastlog $maximapid $selector); + $pidfile $port %perlvar $lastlog); sub maximareply { my ($cmd) = @_; @@ -66,7 +64,7 @@ sub maximareply { unless ($cmd=~/\;\n$/) { $cmd.=";\n"; } my ($cmd_in, $cmd_out, $cmd_err); - $maximapid = open3($cmd_in, $cmd_out, $cmd_err, 'maxima'); + my $maximapid = open3($cmd_in, $cmd_out, $cmd_err, 'maxima'); $children{$maximapid} = 1; print $cmd_in $cmd; @@ -76,15 +74,16 @@ sub maximareply { $SIG{ALRM} = sub { kill 9 => $maximapid; }; alarm(5); - no strict 'refs'; - $selector = IO::Select->new(); + my $selector = IO::Select->new(); $selector->add($cmd_err, $cmd_out); 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>); @@ -98,9 +97,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); } @@ -249,15 +248,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');