Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
17
ZUGRIFFE
1243
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    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.
    Geändert von lordosiris (23.04.12 um 22:18 Uhr)
     

  2. #2
    Avatar von ComFreek
    ComFreek ist offline Mod | @comfreek
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    3.244
    Zeig doch mal deinen Code!
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #3
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    Oh, natürlich.

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

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

  4. #4
    deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.731
    Hallo.

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

    Gruß
    lordosiris bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    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. #6
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    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:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    
    while (strcmp(exit,input) != 0) {
            printf("$ ");
            gets(input);
            strcpy(input2, input); //String kopieren
            command = strtok(input, "-"); //Kommando erstellen
            option = strstr(input2, "-"); // Optionen trennen
        }

    Um den Befehl auszuführen dachte ich an sowas:

    Code c:
    1
    
    execvp(command, option);

    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. #7
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.719
    Zitat Zitat von lordosiris Beitrag anzeigen
    da mein Thread direkt darunter schon als erledigt abgehackt wurde, muss ich jetzt einen neuen aufmachen.
    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.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  8. #8
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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);
        }

    $ Hallo -al
    Kommando: Hallo , Option: -al
    $ la
    Kommando: la, Option: (null)
    $ ls
    Kommando: ls, Option: (null)
    A NULL argv[0] was passed through an exec system call.
    Abgebrochen
    Compiler Fehlermeldung:
    yash.c:19:3: Warnung: Übergabe des Arguments 2 von »execvp« von inkompatiblem Zeigertyp [standardmäßig aktiviert]
    /usr/include/unistd.h:575:12: Anmerkung: »char * const*« erwartet, aber Argument hat Typ »char *«
    Kompilierung erfolgreich beendet.
    Aber damit anfangen kann ich leider nichts.
     

  9. #9
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.719
    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 cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    
    char *params[3];
    params[0] = command;
    params[1] = options;
    params[2] = NULL;
     
    execvp(command, params);
    //oder auch, weil gleicher Inhalt
    execvp(params[0], params);
    lordosiris bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  10. #10
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    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?

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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;
     

  11. #11
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.719
    Hast du params[2] gesetzt?
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  12. #12
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    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. #13
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.719
    :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.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  14. #14
    lordosiris ist offline Mitglied Bronze
    Registriert seit
    Aug 2011
    Beiträge
    38
    Oh ******e. Das ist peinlich

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

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 ^.^
     

  15. #15
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.719
    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?
    lordosiris bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 24
    Letzter Beitrag: 25.06.10, 13:29
  2. [ApectJ] declare parents
    Von TommyMo im Forum Java
    Antworten: 4
    Letzter Beitrag: 18.01.06, 14:07
  3. flackern bei Mdi-Childs
    Von masmin im Forum .NET Windows Forms
    Antworten: 4
    Letzter Beitrag: 20.10.05, 11:19
  4. Wie kriege ich die parents?
    Von elmato im Forum Java
    Antworten: 4
    Letzter Beitrag: 07.06.05, 22:35
  5. Antworten: 9
    Letzter Beitrag: 29.05.05, 23:03