Verständnis execve
-
Hi Community,
ich befasse mich gerade ein wenig mit der C Programmierung unter Linux. (Hoffe das ich das hier im C++ Forum posten darf.)
Ich versuche gerade den systemcall execve zu verstehen. Ich möchte gerne ein Programm starten mit übergabe von Argumenten und Environment Variablen.Dazu habe ich folgendes versucht:
#include <unistd.h> #include <stdio.h> void main() { char *argv[] = { "xterm", "-bg", "green", 0 }; char *envp[] = { "PATH=/bin", 0 }; execve(argv[0], &argv[0], envp); fprintf(stderr, "Oops!\n"); }
komischerweise liefer der systemcall mir einen fehler und die ausführung findet nicht statt. Weis jemand wieso?
Wenn ich in der Shell:
xterm -bg green PATH=/bin
eingebe wird das anstandslos akzeptiert.
Hab ich noch irgendwo etwas vielleicht vergessen?
Danke für eure HilfeGruß Vertax
-
execve
beachtet denPATH
nicht, dafür brauchst du execvp:
http://linux.die.net/man/3/execvWenn du unbedingt via execve einen Custom-PATH übergeben möchtest, könntest du das zB. mit
/bin/sh -c
machen.edit: man.cx rendert die execvp-Manpage nicht.
-
Tipp: Benutz perror() um eine Fehlermeldung zu bekommen
execve( ... ); perror("execve");
-
Hi, danke erstmal für die Antworten, perror benutze ich in ner ErrorHandling function die ich immer nach nem excec aufrufe.
Nur bin ich aus der Fehlermeldung nicht schlau geworden:Fehler bei execve: No such file or directory
Was ich aber immer noch nicht verstehe:
Bei excecve steht das v ja für vektor und e für environment.
PATH ist aber doch eine environment variable, wieso funktioniert das dann nicht für xterm nicht, aber für /bin/sh -c env PATH=/bin jedoch schon?excecvp
-
Die neue Umgebung wird nur dem Prozess übergeben, aber nicht zum finden des Binaries benutzt. Das ist genau der Unterschied zwischen execve und execvpe.