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:
The ".=" operator appends the string to the existing path. The associative array$ENV{PATH} .= ":/usr/local/bin:/u/share/bin";
%ENV
contains the scripts environment
variables.
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.#!/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");
Comments to:
webmaster@geom.umn.edu
Created: May 09 1996 ---
Last modified: Tue Jun 4 22:12:50 1996