When a CGI script runs, it behaves as a separate user, the http daemon. Consequently, it inherents a user envrionment. Typically, this environment is minimal, containing almost no path information, for example. Thus, if you are going to run other software, you must add the path to the script's environment:
$ENV{PATH} .= ":/usr/local/bin:/u/share/bin";
The ".=" operator appends the string to the existing path. The
associative array %ENV contains the scripts environment
variables.
#!/usr/local/bin/perl
$ENV{PATH} .=":/usr/local/bin:/u/share/bin";
#get the current process number
$pid = $$;
#open a connection to Maple
$maple = "| maple -q > maple.$pid";
$maplegif = "maplegif.$pid";
open(MAPLE, $maple) || print STDERR "Maple can't be opened!\n";
#Send commands via print
print MAPLE "print(2 + 3); \n";
print MAPLE
"interface(plotdevice=gif,plotoutput=`$maplegif`,plotoptions=`width=500,height=300`);\n";
print MAPLE
"plot(x^2, x=-2..2);";
print MAPLE "quit;\n";
close(MAPLE);
#Set up some unique file names
$math_in = "math_in.$pid";
$math_out = "math_out.$pid";
$math_ps = "math_ps.$pid";
$math_gif = "math_gif.$pid";
#Construct a batch input file
open(MATH, "> $math_in") || print STDERR "Math can't be opened!\n";
print MATH "4 + 5\n";
print MATH "Display[\"$math_ps\",Plot[x^2, {x,-2,2},DisplayFunction->Identity]];\n";
print MATH "Quit \n";
close(MATH);
#process the file, convert the PS output
system("math -batchinput -batchoutput <$MATH_IN > $math_out");
system("psfix $math_ps | convert - $math_gif");
Another strategy for interacting with external programs is
sending messages via a client-side helper applet. One implementation
of this idea is the
Hamlet project at the
University of Utah. Further examples of web pages using this strategy
can be found at the
UCES web site at
Ames National Laboratory.
The Geometry Center Home Page
Comments to:
webmaster@geom.umn.edu
Created: May 09 1996 ---
Last modified: Tue Jun 4 22:12:50 1996