fgets, strtok und execvp
-
Ich schreibe gerade meine "eigene" shell und habe ein bisschen probleme.
Vorweg, wenn ich diesen Code schreibe, funktioniert execvp problemlos:
char *test[20]; test[0] = "ls"; test[1] = "-a"; test[2] = getenv("HOME"); test[3] = NULL; .... if (execvp(test[0], test) < 0) { /* execute the command */ printf("*** ERROR: exec failed\n"); exit(EXIT_FAILURE); }
Ich moechte aber eine Eingabe von dem Benutzer uebergeben und habe bis her folgendes:
void read_command(char *argumente[]){ //*argumente[20]= {0}; int i = 0; char str[100] = {0}; fgets(str, 100, stdin); char delims[] = " \n"; char *result = NULL; result = strtok( str, delims ); argumente[i] = result; while( result != NULL ) { result = strtok( NULL, delims ); if(result != NULL ){ i++; argumente[i] = result; }else{ i++; argumente[i] = NULL; } } }
Dazu muss ich erwähnen, dass ich forke, dem Kindprozess das ececvp machen lasse und den Elterntail einfach warten lasse.
Wenn ich nun zum beispiel: "ls -l" eingebe.. funktioniert es nicht, obwohl wenn ich das Array durch iterriere [0] = ls [1] = -l und [2] = Null ist.
Das execvp schmeißt dann die Fehlermeldung. Jedoch führt er manchmal den Befehl aus.
Wo ist mein Denkfehler?
-
mscholz3 schrieb:
Wo ist mein Denkfehler?
Die Zeiger in argumente[] zeigen auf str
str ist eine lokale Variable. Und die verliert ihre Gültigkeit beim verlassen der Funktion.Dein
if-else
ist überflüssig. Wenn result == NULL ist, dann kannst du auch imif
-Zweig bleiben. Dann brauchst du keinelse
und somit auch keinif
.
-
Danke sehr!! jetzt klappt es..
Daran habe ich garnicht gedacht, da eigentlich "fast" immer eclipse ne warning schmeißt, wenn man sowas macht.
-
Magst du, für Andere mit ähnlichem Problem, deine Lösung posten?