带有 C 包装器的 Perl CGI

Perl CGI with C Wrapper

问题的基础。我有一项大学作业要求我为电话簿编写一个基于 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。我已尽力调试它,包括 headers 等的间距。它在终端中运行良好,但在网络浏览器中运行不佳。服务器httpd错误日志显示"Premature end of headers"的错误。但是,我看不出怎么会过早结束。

任何人都可以提供任何帮助,我们将不胜感激。

我没有在实际服务器上编译 C Wrapper,因此得到了不兼容的不同机器代码。不幸的是,服务器最初拒绝编译它,我忘记了它是什么时候必须在那台机器上编译的。天呐!

与任何系统调用一样,您应该始终检查来自 execl() 的错误。通常你会查看 return 值,但这不是必需的,因为成功将终止程序。

execl( REAL_PATH, REAL_PATH, 0 );
perror("exec of '"REAL_PATH"' failed");

这使用 perror 处理将 errno 转换为人类可读的错误字符串并将其打印到标准错误。

我也会避免将 #define 用于字符串常量,它们很难使用。而是按照 this answer.

中的建议使用 static const char REAL_PATH[] = "ids.pl"

而且我不明白您为什么需要 C 包装器。您的 Web 服务器 运行 解释代码有某种奇怪的限制?