Include Problem



  • Hallo,

    warum erhalte ich hierbei einen Fehler?

    #include <sys/types.h>
    ...
    #include <signal.h>
    ...
    kill (children[n], SIGKILL);
    

    Wobei children[n] ein int[] ist und n ein int.



  • Kann man das zusammenführen mit http://www.c-plusplus.net/forum/295677 .

    Wutz scheint da ein wenig aggressiv vorgegangen zu sein. Normalerweise wird doch sowas immernoch in die richtige Abteilung verschoben?



  • Der Code:

    ...
    #include <sys/types.h>
    ...
    #include <signal.h>
    ...
    if (pid != 0){//Bin also im Parent
        //Warte darauf, dass alle Kinder fertig sind
        while (pid == waitpid(-1, NULL, 0)) {
            if (errno == ECHILD) {
                 break;
               }
        //Will dann noch die übrig gebliebenen Kinder "killen", damit keine Zombies entstehen
            while(n != 0) {
                n--;
                kill (children[n], SIGKILL);
            }
        }
    }
    

    n enthält die Anzahl der Kinder.
    Und children wird so erstellt: int children[n];

    PS: Sorry für das Doppeltpost, aber ich wusste jetzt nicht genau wohin ...

    MfG The-Forgotten



  • The-Forgotten schrieb:

    Und children wird so erstellt: int children[n];

    Und welchen Wert hat n zu dem Zeitpunkt?



  • Dein gezeigter und gerade eben grob überflogener Code wartet darauf, dass ein Kind endet, danach werden alle anderen Kinder gekillt, SOFERN in children[] die korrekten pid_t stehen.

    Btw: Meiner Ausbildung nach, ist ein Zombie kein verwaister Prozess. Ein Zombieprozess ist beendet, aber seine Returnwert und Eintrag steht noch in der Prozesstabelle.



  • Wenn ich darauf warte, dass alle Prozesse beendet wurden können sie ja immer noch einen Rückgabewert in der Tabelle oder so haben oder verstehe ich das falsch?
    Zumindest meine ich gelesen zu haben, dass im Falle eines Fehlers ein Fehlerwert dort hineingeschrieben wird. So würde doch dann ein Zombie entstehen oder?
    Und nach dem was iach über kill gelesen habe, kann man damit die Einträge aus der Tabelle löschen, da ich noch neu in der Materie bin, kann ich auch total auf dem Holzweg sein...

    Wir kann ich denn sichergehen, dass kein Zombie entsteht?
    Ich habe meinen Parent und dieser kennt seine Kinder .... was muss der Parent nun machen?

    "n" ist die Anzahl erzeugter Kinder und hat diesen wert schon bevor der Ausschnitt beginnt.



  • Ok, also meines Wissens nach:

    Ein Prozess wird nach Beendigung wirklich beendet. Ein Eintrag in der Prozesstabelle bleibt bestehen, damit die Rückgabe(der main()) des Programms vom Elternteil(letzte Instanz wäre unter Ubuntu glaube init) gelesen werden kann.

    Ein Prozess gilt als Zombie, wenn er beendet ist, aber noch in der Prozesstabelle als Eintrag mit PID und Rückgabe etc. "weiterlebt". Zombieprozesse an für sich sind nicht gefährlich, ABER wenn du dauerhaft Zombieprozesse generierst, dann findet dein Betriebssystem möglicherweise keine freie ProzessID mehr.

    Bei kill() bin ich mir nciht sicher, ich vermute, da der Prozess unter Umständen knallhart geschlossen werden kann, dass kein Eintrag in der Prozesstabelle verbleibt.
    Um abgearbeitete Prozesse aus der Tabelle zu entfernen kannst du waitpid() nutzen, der zweite Parameter stellt eine Möglichkeit dar, um die Rückgabe des Child zu erfahren.

    Kein Zombie dürfte entstehen, wenn dein Programm auf die Beendigung aller Kinder wartet und die Rückgaben ausliest oder alle Kinder mittels kill() zum Abbruch zwingt.

    Wenn dein Programm also selbst dazu gebracht wird sich zu beenden, dann kannst du deine Kinder mit kill ebenfalls zum Beenden zwingen.
    Wenn dein Programm aber nicht beendet werden soll, dann warte auf deine Kinder: Also waitpid(), da wird dann auch gleich der Eintrag in der Tabelle gelöscht.

    Was soll dein Programm machen? Was macht es stattdessen?



  • The-Forgotten schrieb:

    Hallo,

    warum erhalte ich hierbei einen Fehler?

    #include <sys/types.h>
    ...
    #include <signal.h>
    ...
    kill (children[n], SIGKILL);
    

    Wobei children[n] ein int[] ist und n ein int.

    Einen Tip hätte ich: Wenn Du Hilfe bekommen willst, dann beschreibe den Fehler ein wenig genauer. Bekommst Du einen Compilefehler oder Linkfehler oder Laufzeitfehler. Und die Fehlermeldung gehört immer auch dazu.


Anmelden zum Antworten