问题的基础。我有一项大学任务,要求我为电话簿编写一个基于Perl / CGI的网站。这部分很好,我很高兴,但是,我有包装cgi文件的问题。在没有任何问题之前我已经完成了一次但是这次也无法复制那次成功。
显示用户ID的基本Perl文件:
#!/usr/bin/perl -w
use English;
print "Content-type: text/html";
print "\n";
print "\n";
print "\n";
print "<html>\n";
print "<head><title>IDS.CGI</title></head>\n";
print "<body>\n";
print "<p>\nMy User ID is $UID\n</p>";
print "<p>\nMy effective User ID is $EUID\n</p>";
print "<p>\nMy Group ID is $GID\n</p>";
print "<p>\nMy effective Group ID is $EGID\n</p>";
print "\n</body>\n";
print "</html>\n";
Wrapper.C:
#include <stdio.h>
#include <unistd.h>
#define REAL_PATH "ids.pl"
int
main()
{
execl( REAL_PATH, REAL_PATH, 0 );
printf( "You should never see this message!\n" );
}
这会导致内部服务器错误500.我已经尽力调试它,包括标题的间距等。它在终端中运行良好,但在Web浏览器中运行不正常。服务器httpd错误日志显示&#34;标头过早结束&#34;的错误。然而,我无法看到它是如何过早结束的。
任何人都可以提供任何帮助将不胜感激。
答案 0 :(得分:1)
与任何系统调用一样,您应始终检查来自execl()
的错误。通常你会查看返回值,但这不是必要的,因为成功将终止程序。
execl( REAL_PATH, REAL_PATH, 0 );
perror("exec of '"REAL_PATH"' failed");
这使用perror
来处理将errno
转换为人类可读的错误字符串并将其打印到stderr。
我也避免使用#define
作为字符串常量,它们很难处理。而是按照this answer中的建议使用static const char REAL_PATH[] = "ids.pl"
。
我不明白为什么你需要一个C包装器。运行解释代码的Web服务器上有某种奇怪的限制?
答案 1 :(得分:0)
我没有在实际服务器上编译C Wrapper,因此获得了不兼容的不同机器代码。不幸的是,服务器拒绝最初编译它,我忘了它什么时候必须在那台机器上编译。我呢!