2016-05-04 9 views
0

Basis des Problems. Ich habe eine Universitätsaufgabe, die mich auffordert, eine Perl/CGI basierte Website für ein Telefonbuch zu schreiben. Dieser Teil ist in Ordnung und ich bin damit zufrieden, aber ich habe Probleme mit dem Einpacken der CGI-Dateien. Ich habe es schon einmal gemacht, aber es war nicht möglich, dieses Mal das gleiche zu wiederholen.Perl CGI mit C Wrapper

Grund Perl-Datei Benutzer-ID zu zeigen, ist:

#!/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"); 
} 

Dies ist ein interner Serverfehler werfen 500. ich mein Bestes versucht haben, es zu debuggen Abstand einschließlich für die Header usw. Es läuft gut im Terminal, aber nicht in den Webbrowsern. Die Server httpd Fehlerprotokoll zeigt, dass der Fehler "vorzeitige Ende der Header". Ich kann jedoch nicht sehen, wie es zu einem vorzeitigen Ende kommt.

Jede Hilfe, die jemand anbieten kann, würde sehr geschätzt werden.

+0

Diese Art von Sache ist normalerweise, weil das CGI-Programm stirbt, und das * "Vorzeitige Ende der Header" * bedeutet nur, dass es nichts druckt. Haben Sie überprüft, dass sowohl das C-Programm als auch das Perl-Skript vom System ausführbar sind? Ich bin mir nicht sicher, warum Sie ein C-Programm für Ihr CGI ausführen. Behandelt Ihr Server Perl-Code nicht direkt? Ich schlage vor, dass Sie Ihr C-Programm so modifizieren, dass Sie nur "Content-type: text/plain \ n \ nTest erfolgreich \ n"; 'ausdrucken, anstatt zu versuchen, Ihr Perl-Programm auszuführen. Das wird den C-Code beseitigen, wenn es erfolgreich ist – Borodin

+0

Überprüfen Sie die Lösung hier http://stackoverflow.com/questions/17583341/error-500-premature-end-of-script-headers, z. waren die berechtigungsbits des cgi programms richtig? – fluter

+1

Was lässt Sie denken, dass Sie diesen Wrapper brauchen? – duskwuff

Antwort

0

Ich kompilierte den C Wrapper nicht auf dem tatsächlichen Server und erhielt daher verschiedene Maschinencodes, die nicht kompatibel waren. Leider verweigerte der Server es ursprünglich zu kompilieren und ich vergaß, wenn es tat, dass es auf diesem Computer kompiliert werden musste. Doh ich!

1

Wie bei jedem Systemaufruf sollten Sie immer einen Fehler von execl() überprüfen. Normalerweise würden Sie sich den Rückgabewert ansehen, aber das ist nicht notwendig, weil der Erfolg das Programm beenden wird.

execl(REAL_PATH, REAL_PATH, 0); 
perror("exec of '"REAL_PATH"' failed"); 

Dies verwendet perror zu handhaben errno in eine für Menschen lesbare Fehlerzeichenfolge drehen und druckte nach stderr.

Ich würde auch vermeiden, #define für String-Konstanten verwenden, sie sind peinlich mit zu arbeiten. Verwenden Sie stattdessen static const char REAL_PATH[] = "ids.pl" wie in this answer vorgeschlagen.

Und ich verstehe nicht, warum Sie einen C-Wrapper benötigen. Irgendeine seltsame Einschränkung auf Ihrem Webserver, auf dem interpretierter Code läuft?