FastCGI与Ada语言

4

我发现了一个相关的IT技术网站:http://support.zeus.com/zws/examples/2005/12/16/hello_world_in_perl_and_c,并且这两个示例都能正常运行。

现在我试着将其用于Ada,但是两天来一直无法完成。

fcgi_stdio.ads

with Interfaces.C;
with Interfaces.C.Strings;

package fcgi_stdio is
    function FCGI_Accept return Interfaces.C.int;
    pragma Import (C, FCGI_Accept, "FCGI_Accept");

    procedure FCGI_printf (str : Interfaces.C.Strings.chars_ptr);
    pragma Import (C, FCGI_printf, "FCGI_printf");
end fcgi_stdio;

test.adb

with fcgi_stdio;
with Interfaces.C;
with Interfaces.C.Strings;

procedure Test is
begin
    while Integer (fcgi_stdio.FCGI_Accept) >= 0 loop
        fcgi_stdio.FCGI_printf (Interfaces.C.Strings.New_String ("Content-Type: text/plain" & ASCII.LF & ASCII.LF));
        fcgi_stdio.FCGI_printf (Interfaces.C.Strings.New_String ("Hello World from Ada!" & ASCII.LF));
    end loop;
end Test;

当我在控制台中运行时,会出现以下错误:
$ ./test
raised STORAGE_ERROR : stack overflow or erroneous memory access

Apache错误日志显示:

Premature end of script headers: test

有人知道如何让它工作吗?

1个回答

7

在 Mac OS X 上进行实验,似乎问题在于 FCGI_printf() 是一个可变参数函数。它调用了同样是可变参数的 FCGI_fprintf() 函数:

int FCGI_fprintf(FCGI_FILE *fp, const char *format, ...)
{
    va_list ap;
    int n = 0;
    va_start(ap, format);          <------ crash here

Ada没有一种标准的方式来指定varargs函数,GNAT也没有实现定义的方式。

GNAT文档指出解决方法是为varargs函数提供一个C包装器:

#include <fcgi_stdio.h>
int FCGI_printf_wrapper(const char *msg)
{
  return FCGI_printf(msg);
}

并导入包装器:

procedure FCGI_printf (str : Interfaces.C.Strings.chars_ptr);
pragma Import (C, FCGI_printf, "FCGI_printf_wrapper");

该程序的另一个问题是,在Ada语言中,与C和许多其他语言不同,"\n"不能在字符串中插入换行符。请尝试。
fcgi_stdio.FCGI_printf
  (Interfaces.C.Strings.New_String ("Content-Type: text/plain" 
                                    & ASCII.LF & ASCII.LF));

[edited 13.1.13]


谢谢,我已经更正了!但是错误还是一样的。 - user1091344
请问,您是如何在Mac上进行编程的?您是如何得知它在va_start(ap, format)行崩溃的信息的? - user1091344
我使用Emacs,并通常从命令行构建。我在我的博客上写了这篇文章。任何人知道SO协议吗?我应该在这里编辑答案吗? - Simon Wright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接