带有 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 服务器 运行 解释代码有某种奇怪的限制?
问题的基础。我有一项大学作业要求我为电话簿编写一个基于 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 服务器 运行 解释代码有某种奇怪的限制?