2013-01-12 61 views
4

我發現http://support.zeus.com/zws/examples/2005/12/16/hello_world_in_perl_and_c,這兩個例子正在工作。FastCGI與Ada

現在我試了這個Ada,並且自2天以來我無法完成。

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 

有沒有人有一個想法,我可以得到它的工作?

回答

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 

阿達沒有指定可變參數函數的標準方式,以及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"); 

與該程序的另一個問題是在阿達,不像C和許多其他語言,"\n"不是在字符串中插入換行符的方式。嘗試

fcgi_stdio.FCGI_printf 
    (Interfaces.C.Strings.New_String ("Content-Type: text/plain" 
            & ASCII.LF & ASCII.LF)); 

[編輯13.1.13]

+0

謝謝,我糾正它!但錯誤仍然是一樣的。 – user1091344

+0

精彩,我的英雄:-)它正在工作。 – user1091344

+0

請問,您如何在Mac上編程?你如何得到它在va_start(ap,format)行崩潰的信息;? – user1091344