fork und exec wollen als CGI nicht laufen



  • Hallo,
    ich möchte in einem CGI-Skript in C ein weiteres Programm starten. Genauer: Ich möchte Gnuplot mit einer Datei als Parameter starten, das mit dann ein png erzeugt.
    Meine Funktion habe ich mal als eigenständiges Programm erzeugt. Wenn ich dieses dann auf der Konsole starte wird auch mein Bild erzeugt.
    Als Funktion in meinem CGI-Skript tut sich aber gar nichts, execlp() wird auch nicht mit Fehlermeldung beendet.

    Hier mal meine Funktion zum Starten Gnuplots:

    void start_gnuplot()
    {
    	int returnval = 0;
    	pid_t pid;
    	switch(pid = vfork()) {	
    		case -1:
    			fprintf(cgiOut, "<br>Fehler beim Aurfuf von fork()<br>\n");
    			exit(1);
    		case 0: /* child */
    			returnval = execlp("/usr/bin/gnuplot", "gnuplot", "/usr/lib/cgi-bin/show.gp", NULL);
    			fprintf(cgiOut, "<br>Fehler bei execlp<br>\n"); 
    			break;
    		default: /* parent */
    			fprintf(cgiOut, "<br>PID = %d<br>\n", getpid());
    			break;
    	}	
    }
    

    Könnte das evtl. daran liegen, dass Apache die das CGI startet?



  • Das Ganze hat rein gar nichts mit Apache zu tun. Das Thema hier ist HTTP. Als Rückantwort muss das CGI-BIN nämlich eine korrekte HTTP-Antwort liefern. In der Regel sieht das so aus:

    Content-type: text/html
    Content-length: 33
    [i]Leerzeile[/i]
    <html><body>Antwort</body></html>
    

    Achtung: Besonders die Leerzeile (CR+LF) ist wichtig!

    Martin



  • Also die HTTP-Antwort liefere ich schon, ich habe hier nur die Funktion zum Starten von Gnuplot hingeschrieben.
    Ich verwendet die CGIC-Bibliotheken von Boutell http://www.boutell.com/cgic/, vielleicht hat es ja damit was zu tun. Wenn ich in der cgiMain() nämlich einen system() Aufruf versuche, wird dieser auch nicht ausgeführt und ich bekomme als Rückgabewert von system(): "Resource temporarily unavailable"

    Erstelle ich jedoch ein einfaches Programm mit nur einer main() Funktion und dem system() Aufruf darin, klappt alles wunderbar (auch wenn es vom Apache ausgeführt wird).
    Irgendwie habe ich in der cgiMain() wohl keine Rechte, um system() oder exec() auszuführen, ich weiß aber nicht wie ich das ändern kann.


Anmelden zum Antworten