【问题标题】:Perl CGI with C Wrapper带有 C 包装器的 Perl CGI
【发布时间】:2016-08-29 07:11:48
【问题描述】:

问题的基础。我有一个大学作业要求我为电话簿编写一个基于 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";

包装器.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 错误日志显示“标题过早结束”的错误。但是,我看不出有什么过早的结束。

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

【问题讨论】:

  • 这种事情通常是因为 CGI 程序正在死去,而 "Premature end of headers" 只是意味着它没有打印任何东西。您是否检查过 C 可执行文件和 Perl 脚本都可以被系统执行?我不确定你为什么要为你的 CGI 运行 C 程序。您的服务器不会直接处理 Perl 代码吗?我建议您修改您的 C 程序以仅打印 "Content-type: text/plain\n\nTest succeeded\n"; 而不是尝试运行您的 Perl 程序。如果成功,那将消除 C 代码
  • 在这里查看解决方案stackoverflow.com/questions/17583341/…,例如cgi 程序的权限位对吗?
  • 是什么让你觉得你需要那个包装器?
  • 绝对不是权限问题。需要 C Wrapper 才能使 CGI 在从 Web 服务器提供时作为文件的所有者执行,而不是作为“nobody”默认用户。
  • 我猜这是路径问题,即 C 程序没有找到 Perl 程序。试试#define REAL_PATH "/full/path/to/ids.pl"

标签: c perl cgi wrapper


【解决方案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 服务器有某种奇怪的限制?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-19
      • 2017-01-29
      • 1970-01-01
      • 2013-11-21
      • 2014-10-03
      • 1970-01-01
      • 2011-09-11
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多