Aufruf von exec zurück errno 14 (ungültige Adresse) mit absoluten Pfad
in eine einfache cgi-server für einen Kurs. Zu tun, dass in einigen Punkt, den ich machen muss um ein fork/exec zum starten der cgi-handler, das problem ist, dass die exec-immer wieder errno 14. Ich habe versucht den folgenden code in eine standalone-version funktioniert es mit und ohne den absoluten Pfad.
Hier der code:
static void _process_cgi(int fd, http_context_t* ctx)
{
pid_t childProcess;
int ret;
char returnValue[1024];
log(LOG, "calling cgi", &ctx->uri[1], 0);
if((childProcess = fork()) != 0)
{
///
///Set the CGI standard output to the socket.
///
dup2(fd, STANDARD_OUTPUT);
//ctx->uri = "/simple.cgi"
execl("/home/dvd/nwebdir/simple.cgi",&ctx->uri[1]);
sprintf(returnValue,"%d",errno);
log(LOG, "exec returned ", returnValue, 0);
return -1;
}
ret = waitpid(childProcess,NULL,0);
sprintf(returnValue,"%d",ret);
log(LOG, "cgi returned", returnValue, 0);
}
Hier ist die Liste der sys-Aufrufe, dass der server übergibt vor dem erreichen mein code (in der Reihenfolge):
- chdir
- Gabel
- setpqrp
- Gabel
Ich weiß nicht, ob dies relevant ist oder nicht, aber in meinem test-Programm habe ich nicht chdir noch setpqrp.
Den test-code ist der folgende:
pid_t pid;
if ((pid = fork()) != 0)
{
execl("simple.cgi","simple");
//execl("/home/dvd/nwebdir/simple.cgi","simple");
return 0;
}
printf("waiting\n");
waitpid(pid, NULL, 0);
printf("Parent exiting\n");
Hinweis: ich habe versucht, sowohl die execl und execlp in der server-code.
Finden Sie die grundlegende server-Implementierung (ohne CGI) hier, die einzige Veränderungen die ich gemacht habe war in der web-Funktion:
http://www.ibm.com/developerworks/systems/library/es-nweb/index.html
Hinsichtlich
InformationsquelleAutor DVD | 2012-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Null ist erforderlich, da execl() ist eine varargs - Funktion.
Aufrufen undefinierten Verhalten führt zu undefinierten (Lesen unberechenbares) Verhalten, einschließlich manchmal erscheinen, um zu arbeiten.
Wunder C XD danke Jonathan
InformationsquelleAutor wildplasser
Das Letzte argument für
execl()
muss ein null -char *
. Sie können in der Regel Weg mit schreibenNULL
statt(char *)0
, aber es ist vielleicht nicht das gewünschte Ergebnis erzielen, wenn Sie#define NULL 0
und Sie werden auf eine Maschine, wosizeof(int) != sizeof(char *)
wie ein 64-bit system.#define NULL 0
Sie verdienen beschissenes VerhaltenInformationsquelleAutor Jonathan Leffler
BTW, entweder man kopiert den code falsch, oder es hat eine Logik-Fehler. Fork() gibt null parent-Prozess, nicht ein Kind, so Bedingung muss rückgängig gemacht werden. (Es gibt keine Schaltfläche "Kommentar" hier so zu beantworten.)
InformationsquelleAutor Netch