|
我用c写的一个web服务器,支持CGI时候出错,具体情况如下:
可以正确解析出cgiPath,caiName
如:cgiPath = "./cgi-bin/vote.pl";
cgiName = "vote.pl";
envp也正确赋值
如:
envp[0] = "REQUEST_METHOD=POST";
envp[1] = "CONTENT_LENGTH=6";
envp[2] = "CONTENT_TYPE=text/html";
其中,要执行的文件为vote.pl的perl脚本(execle(cgiPath,cgiName,(char *)0,envp)),为什么执行会出错?
已经chmod a+rx vote.pl,vote.pl 了,错误提示;Bad Adress,而且我已经试过把cgiPath改为"/root/my/cgi-bin/vote.pl"
现在关键问题是:cgi不能正常运行,不能将执行结果输出到STDOUT,请高手指点。
cgi脚本是从网上下的:
#!/usr/bin/perl
print"Content-type:text/html\n\n";
print"<titel>投票系统</title>";
if($ENV{'REQUEST_METHOD'}eq"POST"){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'}eq"GET"){
$buffer=$ENV{'QUERY_STIRNG'};
}
@pairs=split(/&/,$buffer);
foreach $pair(@pairs){
($name,$value)=split(/=/,$pair);
$value=~tr/+//;
$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;
$FORM{$name}=$value;}
$filename="/vote.dat";
%NAME=("A","张德陪","B","阿加西","C","桑普拉斯","D","贝克","E","顾懿");
if($ENV{'REQUEST_METHOD'}eq"POST"){
print"Content-type:text/html\n\n";
print"<titel>投票系统</title>";
print"<h1>投票系统的例子</h1>";
open(FILE,"<$filename")||die"不能打开文件,请和管理员联系\n";
for($i=0;$i<2;$i++){
$file[$i]=<FILE>;
$file[$i]=~s/\n$//;
}
close(FILE);
@item=split(/:/,$file[0]);
@vote=split(/:/,$file[1]);
for($i=0;$i<@item;$i++){
if($FORM{'idol'}eq$item[$i]){
$vote[$i]++;
last;
}
}
open(FILE,">filename")||die"Can't Open the file";
$item=join(":",@item);
$vote=join(":",@vote);
pirnt FILE "$item\n";
print FILE "$vote\n";
close (FILE);
print"<h2>您是投票给$NAME{$FORM{'idol'}},谢谢您的选票!<h2>";
print"查询<a href=\"/cgi-bin/vote.pl?command=viem\">投票结果系统</a>";
}
if($FORM{'command'}eq"view"){
print "HTTP/1.0 200\n";
print "Content-type:text/html\n\n";
print"<title>投票结果</title>";
print"<h1>投票结果</h1>";
open (FILE,"$filename")||die"文件打开错误";
for($i=0;$i<2;$i++){
$file[$i]=<FILE>;
$file[$i]=~s/\n$//;
}
close(FILE);
@item=split(/:/,$file[0]);
@vote=split(/:/,$file[1]);
print"<table border=1>";
for($i=0;$i<@item;$i++){
print"<tr><td>姓名</td><td>$NAME{$item[$i]}</td><td>票数</td>,td>$vote[$i]</td><tr>";
}
print "</table>";
} |
|