Mehrere Prozesse - fork



  • Hallo,

    Ich habe gerade mit dem Thema fork angefangen und bin dabei ein Übungsprogramm dazu zu schreiben. Es sollte folgendes tun:
    -Nach Eingabe eines Kommandozeilenbefehls sofort zur Eingabe des nächsten Kommandos auffordern.
    -Ein neuer Prozess soll dieses Kommando ausführen
    -Beim Erzeugen der neuen Prozesse soll deren Prozess-ID durch den Vater ausgegeben werden
    -Die Kinder selbst sollen vor dem Start des Kommandozeilenbefehls ihre eigene Prozess-ID ausgeben
    -Das ganze soll solange ausgeführt werden, bis man Ctrl-C drückt

    Hier mein bisheriger Code:

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    
    int main(void){
    while(1){
     char befehl[42];					//Char-Array fuer den Eingegebenen Befehl
     int ergebniss = 99;					//Ergebnisvarriable der Ueberpruefung
     pid_t retval;
     printf("Bitte geben Sie Ihren Befehl ein: ");		//Ausgabe der Eingabeaufforderung
    
     if(scanf("%41s", befehl) < 1){				//Begrenze die Puffernutzung
        return 1;
     }
    
     retval = fork();
    
     if(retval == 0){
    
     printf("Meine PID (Kind): %d\n", getpid());  
    
     if((strcmp("ls", befehl) == 0)){			//Ueberpruefen, ob Befehl ls ist
        ergebniss = 0;					//Wenn Befehl bekannt setzten der Ergebnisvarriable
     }
    
     if((strcmp("ps", befehl) == 0)){			//Ueberpruefen, ob Befehl ps ist
        ergebniss = 0;					//Wenn Befehl bekannt setzten der Ergebnisvarriable
     }
    
     if((strcmp("pwd", befehl) == 0)){			//Ueberpruefen, ob Befehl pwd ist
        ergebniss = 0;					//Wenn Befehl bekannt setzten der Ergebnisvarriable
     }
    
     if(ergebniss != 0){					//Ueberpruefen ob der Befehl gueltig ist
        printf("Unbekannter Befehl!\n");			//Wenn nicht Ausgabe von Fehlermeldung
        return 1;						//Beenden mit Fehler
     }else{
        execlp(befehl, befehl, NULL);			//Ausfuehrung des Befehls, sollte nicht zurueckkehren
        return 1;						//Falls doch: Fehler
     }
     }else if(retval == 1){
        printf("PID meines Kindes: %d\n", retval);
     }else if(retval == -1){
       perror("fork");
       exit(EXIT_FAILURE);
     }
    }
    }
    

    Ich kann so viele Befehle nacheinander eingeben wie ich möchte und sie werden auch alle ausgeführt. Allerdings stimmt etwas mit der Formatierung nicht. Erst wird der Text "Bitte geben Sie Ihren Befehl ein: " ausgegeben, dann die PID des Kindes und dann kann ich in eine neue Leere Zeile meinen Befehl eintippen.
    Der Vater sollte aber noch nach dem Erzeugen die PID des Kindes ausgeben und das nach der Eingabeaufforderung direkt das Kind seine PID ausgibt ist auch nicht optimal. Zombies sollen erstmal nicht beachtet werden.

    mfg
    gpvw100



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Aus man: fork:

    On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately.

    if (retval == -1) {
    //fehler
    } else if (retval == 0) {
    //kind
    } else {
    //vater mit retval == kind-pid
    }
    


  • Erstmal vielend Dank für deine Antwort. Allerdings habe ich den Aufruf doch genau in diesem Format oder nicht?



  • Nein, Du vergleichst auf ==-1, ==0 und ==1, richtig wäre aber ==-1, ==0 und >0.



  • Vielen Dank für die Hilfe, damit hat es funktioniert. Jetzt muss ich nur noch das Problem mit der Fehlerhafte Ausgabe von "Bitte geben Sie Ihren Befehl ein" Lösen. Hat dazu vielleicht auch jemand einen Tipp?



  • Bevor es weitergeht könntest du kurz sleep aufrufen für eine Sekunde oder so dann wird die Ausgabe nicht "vermischt" (es sei denn der aufgerufene Befehl gibt nach der Wartezeit noch was aus)


Anmelden zum Antworten