C: Parents, Childs, PID

Ja, hab ich. Am Anfang, außerhalb der do/while Schleife.

Sollte ich vl. eine andere exec Funktion verwenden? Werd mich gleich mal daran probieren!
 
:Kopfgegendiewand:
Das soll ja auch so sein.
The exec family of functions replaces the current process image with a new process image
Mit dem (erfolgreichen) Aufruf von exec ist dein Programm beendet, nur das Neue existiert noch.
Du brauchst noch ein fork, um das Ganze parallel laufen zu lassen.
Damit din Programm auf das andere auch noch wartet: wait.
 
Oh ******e. Das ist peinlich :(

Ich hab alle Befehle in den Child Prozess gelegt, und das ganze (fork()) in eine endlos Schleife.

C:
for (;;){
		pid = fork();
		if (pid == 0){
			printf("$ ");
			gets(input);
			strcpy(input2, input);
			command = strtok(input, "-");
			option = strstr(input2, "-");
			params[0] = command;
			params[1] = option;
			params[2] = NULL;
			execvp(params[0], params);
                        exit(0);
		}
	}

Mein Gedanke wäre folgender:
ich brauch eine unendliche Schleife, in der erstelle ich als erstes einen Child Prozess, dann geb ich im Child das $ aus, zerlege die Eingabe, führ den Befehl aus, schließe danach das Child, und beginne wieder oben.

Allerdings gibt er einfach unendlich (?) viele $ $ $ $ $ $ $ $ $ $ $ aus.

Wie ich aus der Endlos Schleife komme, hab ich mir noch nicht überlegt ^.^
 
Du machst ein Child, das tut was.
Gleichzeitig forkt der Parent gleich noch ein paar Childs. Endlos.
Jedes davon schreibt seinen Dollar raus.

Siehe wait (oben auch schon erwähnt).
Der Parent soll ja erst dann weitermachen, wenn der Befehl durch ist?
 
Oh mann, sorry.
Den Fehler dürfte ich nichtmehr machen.

Habs jetzt soweit, dass das ganze funktioniert.

C:
for (;;) {
		pid = fork();
		if (pid == 0){
			printf("$ ");
			gets(input);
			strcpy(input2, input);
			command = strtok(input, " -");
			option = strstr(input2, "-");
			params[0] = command;
			params[1] = option;
			params[2] = NULL;
			printf("Option: \"%s\"\n",option);
			execvp(params[0], params);
		} else {
			wait(0);
		}
	}

Skript wird gestartet, Gibt $ aus, führt die Befehle inkl. Optionen aus.

Aber wie komm ich da bei "exit" am Besten raus.
Habs mit if (strcmp(input,"exit"){ break/exit;} versucht, aber nunja, hat nicht zum erhofften Erfolg geführt.
 
Hm....da müsste man doch erst nach der Eingabe forken

Child soll ja praktisch Parent beenden.
Normalerweise könnte man das zB. mit Returnwert vom main machen
("1 beenden, 0 weiter" oder so),
aber hier kommt dieser Wert ja vom command-Programm, auf das man keinen Einfluss hat.

Zuerst Eingabe aufnehmen, prüfen, dann ggf. beenden oder forken.
C++:
    for (;;) {
        printf("$ ");
        gets(input);
        if(!strcmp(input, "exit"))
            exit(0);
        pid = fork();
        if (pid == 0){
            strcpy(input2, input);
            command = strtok(input, " -");
            option = strstr(input2, "-");
            params[0] = command;
            params[1] = option;
            params[2] = NULL;
            printf("Option: \"%s\"\n",option);
            execvp(params[0], params);
        } else {
            wait(0);
        }
    }
 
Zurück