Wenn in C meine Anwendung unerwartet beendet wird, kann ich vorher eine Funktion aufrufen? Ich schreibe ein Flag in eine Datenbank (processRunning = 1), das verhindert, dass andere Anwendungen einen ähnlichen Prozess starten. Wenn die Anwendung beendet wird, ändert sich das Flag nicht mehr.
Unter POSIX ist es die richtige Lösung, die Daten mit einem robusten Mutex im Shared Memory zu schützen. Wenn Ihr Prozess mit einem stabilen Mutex abgestürzt ist, wird ein anderes Programm, das versucht, den Mutex zu sperren, nicht deadlockt, sondern stattdessen EOWNERDEAD
zurückgeben, und dann hat es die Möglichkeit, den durch den Mutex geschützten Zustand zu bereinigen und pthread_mutex_consistent
aufzurufen.
Bearbeiten: Wenn Sie nur verhindern möchten, dass mehrere Instanzen des Programms ausgeführt werden, gibt es sicherlich bessere / einfachere Methoden, wie das Sperren der Datenbankdatei.
Wenn Ihre Anwendung normal beendet wird, werden Funktionen ausgeführt, die über atexit
registriert wurden. Dies ist eine Standardfunktion, die auf Windows , unix und jede andere Plattform, und auch in C ++ .
Beachten Sie, dass "normal beendet" bedeutet, dass Sie Aufrufe von exit()
ausführen oder von main()
zurückkehren. Wenn Ihre Anwendung über abort()
oder _exit()
beendet wird, oder wenn sie von außen vollständig gelöscht wird, hat sie möglicherweise keine Möglichkeit, eine Bereinigung durchzuführen. Es kann einen besseren Ansatz geben, möglicherweise das Setzen und Löschen des Flags in einem Wrapper-Programm, das die Bereinigung durchführt, unabhängig davon, wie Ihr Programm beendet wird, oder ohne diese Markierung zu verwenden.
Es gibt bessere Möglichkeiten, zu verhindern, dass die Anwendung zweimal ausgeführt wird. Eine Lösung besteht darin, benannte Mutexe systemweit zu verwenden. Eine andere und vielleicht einfachere Lösung ist das Sperren einer Datei (zum Schreiben geöffnet). Selbst wenn die Anwendung abstürzt, werden Ressourcen vom Betriebssystem freigegeben und Sie können die Anwendung erneut starten, da die Datei oder der Mutex nicht mehr gesperrt werden.