gpt4 book ai didi

c - 带 Ada 的 FastCGI

转载 作者:太空狗 更新时间:2023-10-29 15:24:39 26 4
gpt4 key购买 nike

我找到了 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 error_log 显示:

Premature end of script headers: test

有没有人知道我如何让它工作?

最佳答案

在 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 没有指定可变参数函数的标准方法,GNAT 也没有实现定义的方法。

GNAT documentation说解决方案是为可变参数函数提供一个 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));

[编辑 13.1.13]

关于c - 带 Ada 的 FastCGI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14298896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com