1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C: Parents, Childs, PID

Dieses Thema im Forum "C/C++" wurde erstellt von lordosiris, 22. April 2012.

  1. lordosiris

    lordosiris Grünschnabel

    C: EXEC Funktion (PID erledigt)

    Hallo,

    hab hier ein ganzes simples Programm, das macht folgendes:
    Es gibt seine PID aus, dann erstellt es eine Variable Anzahl an Child Prozessen. Die Child Prozesse sagen einmal kurz "Hallo, ich bin <PID> und meine Eltern haben die PID <PID>". Danach schließen die sich, der Parents Prozess wartet darauf und beendet das ganze Programm.

    So weit so gut, funktioniert alles. Glaub ich zumindest.

    Sollte bei der ersten Ausgabe des Eltern Prozesses die PID nicht die selbe sein, wie die jenige, die das Kind dann als die PID seiner Eltern ausgibt?

    Bei mir kommt sowas als Ausgabe.
    PID der Parents: 1972.
    Hallo, ich bin 9924 und meine Eltern sind 9922.

    Hoffe, es war verständlich.
    Zuletzt bearbeitet: 23. April 2012
  2. ComFreek

    ComFreek Mod | @comfreek Moderator

    Zeig doch mal deinen Code!
  3. lordosiris

    lordosiris Grünschnabel

    Oh, natürlich.

    [c]printf("Hallo, ich habe die PID %d\n", getppid());
    for (i = 0; i < amount; ++i) {
    pids = fork();
    if (pids == 0) {
    printf("Hallo, ich bin ein Child Process mit der ID %d und meine Parents haben die ID %d.\n", getpid(), getppid());[/c]

    Werden hald in dem Fall möglicherweise mehrere Child Prozesse erstellt.
  4. deepthroat

    deepthroat Premium-User

    Hallo.

    Du darfst bei "ich habe die PID" natürlich nicht getppid() aufrufen.

    Gruß
  5. lordosiris

    lordosiris Grünschnabel

    Danke schön.

    Während ich auf eine Antwort gewartet habe, hab ich mir weiterhin Gedanken drüber gemacht und bin dann selbst draufgekommen, dass PPID in dem Fall ja nicht die PID des aktuellen Prozesses ausgeben kann.

    Ein Buchstabe und das Ding schreibt gleich einen kompletten quatsch!

    Danke an euch 2 :)

    Jetzt hab ich noch eine andere Frage:

    Gibt es eine Möglichkeit, einen String ohne einen anderen String auszugeben?
    Also Beispielsweise habe ich den String "Hallo, ich heiße Hans!" und möchte das ganze ohne "Hans!" ausgeben. "Hans!" steht dabei in einem anderen String.

    E:/ danke, hab schon was passendess gefunden!
  6. lordosiris

    lordosiris Grünschnabel

    C: exec Funktion

    Halli Hallo,

    da mein Thread direkt darunter schon als erledigt abgehackt wurde, muss ich jetzt einen neuen aufmachen.

    Und zwar komme ich mit der exec Funktion überhaupt nicht zurecht, es gibt zick verschiedene, einen richtigen Unterschied für was man welche verwendet, konnte ich nicht entdecken, leider.

    Und zwar ist mein Ziel eine kleine Übergabe der Befehle.

    Mein Programm geht auf, gibt ein Zeichen aus (damit der User weiß, es lebt!), wartet auf die Eingabe eines Shell Befehls und führt diesen aus.

    Bisher hab ich sowas:

    [c]while (strcmp(exit,input) != 0) {
    printf("$ ");
    gets(input);
    strcpy(input2, input); //String kopieren
    command = strtok(input, "-"); //Kommando erstellen
    option = strstr(input2, "-"); // Optionen trennen
    } [/c]

    Um den Befehl auszuführen dachte ich an sowas:

    [c]execvp(command, option);[/c]

    Gebe ich allerdings "ls -al" ein, passiert garnix.
    Lautet meine Eingabe "ls" kommt: A NULL argv[0 was passed through an exec system call.
    Abgebrochen.

    Das wars.

    Und ich komm hier nicht weiter. Wie schon erwähnt, werd ich hier gerade Zwangsbeglückt mit C. Aber ich kanns hald nicht, Google hilft mir momentan auch nicht mehr weiter.
  7. sheel

    sheel Mod # I love Asm Moderator

    Man kann trotzdem reinschreiben,
    und mit einem Klick auf das Erledigt setzt du es wieder auf Nein zurück.

    Da du ja in den Alten schreiben wolltest hab ich den Beitrag dorthin verschoben
    (und das Erledigt schon aufgehoben).


    Zur Frage selbst:
    Wie genau rufst du execvp auf?
    Lass dir die Parameter direkt davor einmal ausgeben.
  8. lordosiris

    lordosiris Grünschnabel

    [c]while (strcmp("exit",input) != 0) {
    printf("$ ");
    gets(input);
    strcpy(input2, input); //String kopieren
    command = strtok(input, "-"); //Kommando erstellen
    option = strstr(input2, "-"); // Optionen trennen
    printf("Kommando: %s, Option: %s\n", command, option);
    execvp(command, option);
    } [/c]

    Compiler Fehlermeldung:
    Aber damit anfangen kann ich leider nichts. :(
  9. sheel

    sheel Mod # I love Asm Moderator

    execvp will als zweiten Parameter keinen einzelnen String, sondern ein Stringarray.
    Jedes Element davon ein Parameter für das startende Programm.
    Und auch, wenns nur ein Parameter ist, muss es trotzdem ein Stringarray sein.

    Zusätzlich noch zu beachten: [0] vom besagten Array ist der Programmname/pfad
    (obwohl schon im ersten execvp-Parameter mitgegeben)
    Und enden muss es mit einem NULL.

    Code (C++):
    1.  
    2. char *params[3];
    3. params[0] = command;
    4. params[1] = options;
    5. params[2] = NULL;
    6.  
    7. execvp(command, params);
    8. //oder auch, weil gleicher Inhalt
    9. execvp(params[0], params);
    10.  
  10. lordosiris

    lordosiris Grünschnabel

    Danke sehr,
    funktioniert jetzt.

    Allerdings funktioniert das ganze 1x. Wenn ich den Befehl "ls" eingebe, gibt er es aus und beendet das Programm.

    Die Optionen, also z.b. ls -al, da ignoriert er -al.

    Warum aber beendet er das ganze nun?

    [c]do {
    printf("$ ");
    gets(input);
    strcpy(input2, input); //String kopieren
    command = strtok(input, "-"); //Kommando erstellen
    option = strstr(input2, "-"); // Optionen trennen
    params[0] = command;
    params[1] = option;
    execvp(command, params);
    } while (strcmp("exit",input) != 0);

    return 0;[/c]
  11. sheel

    sheel Mod # I love Asm Moderator

    Hast du params[2] gesetzt?
  12. lordosiris

    lordosiris Grünschnabel

    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!
  13. sheel

    sheel Mod # I love Asm Moderator

    :Kopfgegendiewand:
    Das soll ja auch so sein.
    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.
  14. lordosiris

    lordosiris Grünschnabel

    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);
    }
    }[/c]

    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 ^.^
  15. sheel

    sheel Mod # I love Asm Moderator

    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?
  16. lordosiris

    lordosiris Grünschnabel

    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);
    }
    } [/c]

    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.
  17. sheel

    sheel Mod # I love Asm Moderator

    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.
    Code (C++):
    1.  
    2.     for (;;) {
    3.         printf("$ ");
    4.         gets(input);
    5.         if(!strcmp(input, "exit"))
    6.             exit(0);
    7.         pid = fork();
    8.         if (pid == 0){
    9.             strcpy(input2, input);
    10.             command = strtok(input, " -");
    11.             option = strstr(input2, "-");
    12.             params[0] = command;
    13.             params[1] = option;
    14.             params[2] = NULL;
    15.             printf("Option: \"%s\"\n",option);
    16.             execvp(params[0], params);
    17.         } else {
    18.             wait(0);
    19.         }
    20.     }
    21.  
  18. lordosiris

    lordosiris Grünschnabel

    Der Wald vor lauter Bäume.

    Danke sehr!

Diese Seite empfehlen