[C/C++] Was passiert wenn ein Programm "gewaltsam" beendet wird?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Chillikid, 26. Dezember 2009 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  1. #1 26. Dezember 2009
    Was passiert wenn ein Programm "gewaltsam" beendet wird?

    Hallo Coder,

    was passiert wenn ein Programm "gewaltsam" beendet wird, z.B. durch Strg+C in der Konsole (Linux-OS).

    Werden Destruktoren von Objekten aufgerufen? Was passiert mit selber per 'new' reserviertem Speicher?

    Außerdem interessiert mich, was mit Threads passiert. Denn normalerweise werden sie bei mir durch ein join() im Destruktor angehalten, aber wenn dieser nun nicht aufegrufen wird, laufen sie dann einfach weiter?

    Ich hoffe, dass sich jemand da ein bisschen auskennt und mir weiterhelfen kann.


    Chillikid
     

  2. Anzeige
    Heute: Deals & Sale mit stark reduzierten Angeboten finden.
  3. #2 26. Dezember 2009
    AW: Was passiert wenn ein Programm "gewaltsam" beendet wird?

    Also Programme die im speicher sind habe ne TimeStack oder wie die genau heissen.
    Kann dir was genaues später sagen.
    Bei mein c++ Programm die mit threads laufen, und gewaltsam gekillt werden, wird der thread automatisch beim beenden gekillt. Da die thread von Programm aufgerufen und verwaltet werden. Ich denke das hängt auch teilweise von OS ab.
     
  4. #3 26. Dezember 2009
    AW: Was passiert wenn ein Programm "gewaltsam" beendet wird?

    wird alles von deinem Betriebsystem gereglt - vom beenden der Threafs bis zur Speicherfreigabe. Destruktor u.ä. wird meines wissens nach nicht aufgerufen.

    genauer kann ichs aber auch nicht sagen ^^
    Generell sollte sowas natürlich vermieden werden!

     
  5. #4 27. Dezember 2009
    AW: Was passiert wenn ein Programm "gewaltsam" beendet wird?

    Unter Linux hast du die Möglichkeit auf das STRG-C zu reagieren, in dem du einen Signalhandler installierst:
    Code:
    #include <csignal>
    
    void sighandler(int signal) {
     if (signal == SIGINT) {
     /* tu irgendwas */
     }
    }
    
    int main() {
     /* .... */
     signal(SIGINT, sighandler);
     /* .... */
    }
    Bei einem STRG-C wird jetzt sighandler() aufgerufen. Andere Signale (wie SIGTERM) kannst du natürlich auch abfragen.
     
  6. #5 27. Dezember 2009
    AW: Was passiert wenn ein Programm "gewaltsam" beendet wird?

    strg+c sendet dem programm ein Signal. Glaube es müsste SIGINT (signal interrupt) sein. Dein Programm kriegt beim Compilen automatisch die Signal Handler verpasst, es sei den du schreibst deinen eigenen. Bei Strg+c, springt dein Programm also automatisch in diesen Signal Handler der das Programm dann killt. Welchen Code er da verpasst bekommt weiß ich nicht, sollte aber glaube ich in der glibc oder so zu finden sein. Vielleicht weiß es ja einer hier. Gehen wir vereinfacht davon aus das einfach ein exit(0) aufgerufen wird.

    Da sämtliche Programme in einem eigenen virtuellen Addressraum (4gb groß bei 32bit Systemen) laufen wird dieser einfach wieder freigegeben. Dazu werden einfach nur die Einträge aus der Pagingtabelle entfernt, und das Programm ist im Speichernirvana. Explizite Aufrufe von Destruktoren finden in deinem Programm also nicht mehr statt. Mit 'new' reservierter Speicher ist in diesem virtuellen Addressraum und verschwindet damit auch von der Bildfläche.

    Paging – Wikipedia

    Da sich deine Threads den gleichen virtuellen Addressraum teilen, liegen auch ihre Stacks und Heaps innerhalb dieser 4 GB und jeglicher in Anspruch genommene Speicher wird schön weggeräumt.
    Wie die Threads jetzt aus dem Scheduler entfernt werden weiß ich nicht. Das Betriebssystem wird das wohl dem Scheduler irgendwie sagen, das der Prozess und seine Threads nicht mehr da sind.

    Bei Linux ist es wichtig Threads nicht mit Kind Prozessen zu verwechseln, diese werden durch fork() erzeugt und laufen in ihrem eigenen Virutellen Addressraum ab. Ein Strg+c an das Kind geschickt beendet hier einen Kindprozess während andere Kindprozesse oder der Elternprozess davon unberührt bleiben. Das tote Kind bleibt dann im Speicher liegen bis Papa es durch einen wait() zu Grabe trägt. So lange tritt das Kind im Scheduler als Zombie auf. Irgendwann wirst du bestimmt noch auf den Namen Zombieprozess stoßen. Stirbt der Elternprozess werden die Kinder platt gemacht und deren Speicherleichen vom Init Prozess adoptiert welcher sie dann ordentlich beseitigt.

    http://de.wikipedia.org/wiki/Zombie_(EDV)

    Ich hoff ich konnte durch meine Ausführungen ein wenig zur Allgemeinen Verwirrung beitragen *g*. Wichtig ist hier einfach zu wissen, das das Programm einfach stoppt und das OS dann Putzfrau spielt und den Speicher freiräumt, alle Dateioperationen beendet, Sockets schließt und das Programm und alle seine Ausläufe aus der Prozessverwaltung entfernt. Bei Windows sollte es genauso laufen, nur dass es keine Zombies gibt usw...
     
  7. #6 27. Dezember 2009
    AW: Was passiert wenn ein Programm "gewaltsam" beendet wird?

    Vielen Dank für die ausführlichen Informationen! Das mit dem eigenen Handler werde ich gleich mal ausprobieren :)

    BW ging, sofern möglich, an alle raus.
     

  8. Videos zum Thema
Die Seite wird geladen...