execvp gibt immer -1 zurück



  • Hallo Leute. Ich habe ein Problem mit folgendem Code.

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <errno.h>
    #define MAX_ARGS 100
    
    int MAXLINE = 256;
    
    int internalcommand(char *);
    void externalcommand(char *);
    
    int main(int argc, char *argv[]) {
    	char line[MAXLINE];
    	char prompt[MAXLINE];
    	pid_t pid;
    	int stat_loc;
    
    	strncpy(prompt, "~>\0", 3);
    
    	for(;;) {
    
    	printf("%s", prompt);			/* prompt ausgeben */
    
    	memset(line, '\0', MAXLINE);
    	fgets(line, MAXLINE, stdin);		/* Befehl von Eingabe lesen */
    
    		if(internalcommand(line) != 0) {	/* Externen Befehl ausfuehren */
    			pid = fork();
    			if(pid == -1) {         // Error, kein Prozess erzeugt
    				printf("Ich kann keine Kinder bekommen!\n");
    			} else if(pid == 0) {      // Kindprozess
    				externalcommand(line);
    				exit(0);
    			} else {                  // Elternprozess
    				wait(&stat_loc);
    			}
    		}
    
    	}
    }
    
    /* Diese Funktion prueft die eingabe auf Kommandos, die intern von der Shell selbst ausgefuehrt werden muessen.
    Sie gibt dabei 0 zurueck, wenn ein internes Kommando gefunden und ausgefuehrt wurde.
    Sie gibt 1 zurueck, wenn kein internes Kommando gefunden wurde. */
    
    int internalcommand(char *line) {
    	int found = 1;
    	if(strncmp(line, "exit\n", 6) == 0) {		/* Kommando fuer Exit gefunden. */
    		exit(0);
    	}
    }
    
    /* Diese Funktion wertet die Parameter aus und ruft eine externe Funktion auf */
    
    void externalcommand(char *line) {
    	char *argv[MAX_ARGS];
        int j=0;
        argv[j++] = strtok (line," ");
        while (j<MAX_ARGS&&(argv[j++]=strtok(NULL," "))!=NULL);
    
        execvp(argv[0],argv);
    	printf("done %d!\n", execvp(argv[0], argv));
    	_exit (1);
    }
    

    Ich bekomme bei execvp immer -1 zurück und finde den Fehler einfach nicht. Kann jemand helfen? Danke schon mal



  • Hat sich erledigt. Hab das '\0' vergessen.



  • die Idee ist gut und an sich hast du keine Fehler im Code (abgehesen, dass ich eher strtok_r nehmen würde). Aber er ist sehr eingeschränkt, was die Befehleingabe betrifft. Gib zum Beispiel cat < ~/.bashrc oder sowas wie cat meine urls.txt ein und siehe was passiert.

    Wenn du pipes, Umleitungen usw. hast, dann musst dein cmdline parser diese erkennen und sie einrichten, wieder forken, usw. Das ist ein Haufen Arbeit. Schön, wenn man das macht, denn da lernt man viel aber es ist unnötige Arbeit, wenn es deutlich schneller und einfacher gehen kann, und zwar so:

    void externalcommand(char *line) {
        execlp("/bin/sh", "/bin/sh", "-c", line, NULL);
        perror("execlp failed");
        _exit(1);
    }
    

Anmelden zum Antworten