Parameterübergabe an execve
-
Hallo, ich möchte iterativ an execve zwei Parameter übergeben. Ein Buchstabe, der erhöht wird. A, B, C usw. Der zweite Parameter "1" ist konstant. Dazu folgender String:
char *argumente[] = {"A","1"};
Den Buchstaben möchte ich so in einer Schleife erhöhen:
argumente[0][0] = argumente[0][1]+1; //Ascii 65 + 1
. Der Programmaufruf sieht so aus:
execvp("Programmname",argumente);
Das Programm stürtzt bei der Erhöhung ab. Der Kompiler meldet keine Fehler. Hat jemand vieleicht eine Idee..?
Mathias
-
An welchem der Argumente, die Du execve übergibst, soll execve erkennen können, wieviele Argumente übergeben wurden? Richtig, es gibt keins. Du musst execve mitteilen, wann die Liste zuende ist. In der Manualpage steht dazu, dass die Liste mit NULL terminiert werden muss.
-
Um LordJaxoms Antwort zu ergänzen:
char *argumente[] = {"Programname", "A", "1", NULL};
Nachtrag:
es ist Konvention, dass das erste Parameter (argv[0]) stets den Pfad des aufrufenden Programms (bzw. des Strings, wie das Programm ausgeführt wurde) enthält. Siehe folgendes Beispiele./* test.c */ #include <stdio.h> int main(int argc, char **argv) { int i; for(i=0; i < argc; ++i) printf("argv[%d] = %s\n", i, argv[i]); return 0; }
/* exec.c */ #include <unistd.h> #define EXE "/home/yanez/tmp/exec/test" #define BASE_PARAMS "Hallo", "Pablo", "was", "gibt", "Alter?", NULL #ifdef WITH_PATH #define PARAMS EXE, BASE_PARAMS #else #define PARAMS BASE_PARAMS #endif int main(void) { char *args[] = {PARAMS}; //return execlp(EXE, PARAMS); return execvp(EXE, args); }
So, wenn man sich an der Konvention hält:
$ gcc exec.c -oexec -DWITH_PATH && ./exec argv[0] = /home/yanez/tmp/exec/test argv[1] = Hallo argv[2] = Pablo argv[3] = was argv[4] = gibt argv[5] = Alter?
Wenn man sich nicht an der Konvention hält:
$ gcc exec.c -oexec && ./exec argv[0] = Hallo argv[1] = Pablo argv[2] = was argv[3] = gibt's argv[4] = Alter?
-
Danke. Das wars. Der erste Parameter ist wohl das Verzeichniss.
-
mathias_8001 schrieb:
Danke. Das wars. Der erste Parameter ist wohl das Verzeichniss.
es muss nicht das Verzeichnis sein, sondern der ganze Pfad oder das String, wie es aufgerufen wurde, z.b. wenn man
../../program
aufruft, dann muss das erste Parameter../../program
sein, bei/bin/ls -alh
ist auch das erste Parameter/bin/ls
und nicht/bin
.