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 im if -Zweig bleiben. Dann brauchst du kein else und somit auch kein if . 😉



  • 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?


Anmelden zum Antworten