GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann exit() den Prozess nicht beenden?

Ja, es gibt einige Umstände, wie zum Beispiel:

Die Funktion exit() ruft zuerst alle von atexit() registrierten Funktionen in der umgekehrten Reihenfolge ihrer Registrierung auf, außer dass eine Funktion nach allen zuvor registrierten Funktionen aufgerufen wird, die zum Zeitpunkt ihrer Registrierung bereits aufgerufen wurden. Jede Funktion wird so oft aufgerufen, wie sie registriert wurde. Wenn während des Aufrufs einer solchen Funktion ein Aufruf der Funktion longjmp() erfolgt, der den Aufruf der registrierten Funktion beenden würde, ist das Verhalten undefiniert.

Wenn eine durch einen Aufruf von atexit() registrierte Funktion nicht zurückkehrt, werden die verbleibenden registrierten Funktionen nicht aufgerufen und der Rest der Verarbeitung von exit() wird nicht abgeschlossen. Wenn exit() mehr als einmal aufgerufen wird, ist das Verhalten undefiniert.

Siehe die POSIX-Seite beim Beenden.

Fügen Sie für weitere Informationen einen Debugger hinzu, wenn Sie die Situation erreichen, und werfen Sie einen Blick auf die Aufrufliste.


Rufen Sie exit() an vom Signalhandler?

In man 7 signal , Abschnitt Async-signalsichere Funktionen Sie können alle Funktionen sehen, die garantiert funktionieren, wenn sie von einem Signal-Handler aufgerufen werden:

Eine Signalbehandlungsfunktion muss sehr vorsichtig sein, da die Verarbeitung an anderer Stelle an einem beliebigen Punkt in der Ausführung des Programms unterbrochen werden kann. POSIX hat das Konzept der "sicheren Funktion". Wenn ein Signal die Ausführung einer unsicheren Funktion unterbricht und der Handler eine unsichere Funktion aufruft, ist das Verhalten des Programms undefiniert.

POSIX.1-2004 (auch bekannt als POSIX.1-2001 Technical Corrigendum 2) erfordert eine Implementierung, um zu gewährleisten, dass die folgenden Funktionen innerhalb eines Signalhandlers sicher aufgerufen werden können:

Dort sehen Sie die Funktionen _Exit() , _exit() und abort() , aber insbesondere nicht exit() . Sie sollten es also nicht von einem Signal-Handler aufrufen.

Das Schlimme ist, dass selbst wenn Sie eine unsichere Funktion von einem Signal-Handler (printf() irgendwelche?), es wird einfach die meiste Zeit funktionieren... aber nicht immer.


Linux
  1. Rufen Sie eine C-Funktion aus C++-Code auf

  2. Wie kann eine gemeinsam genutzte Bibliothek (.so) eine Funktion aufrufen, die in ihrem Ladeprogramm implementiert ist?

  3. Kann ich einen bestehenden vim-Prozess fortsetzen?

  4. Kann ein Prozess unabhängig von einer Shell ausgeführt werden?

  5. Kann ich 127.0.0.1 blind vertrauen?

Wie beendet man einen Prozess in Linux? Befehle zum Beenden

Linux-Prozesse – Speicherlayout, Exit und _exit C-Funktionen

Kann ich GDB verwenden, um einen laufenden Prozess zu debuggen?

Wie implementiert man ein Timeout im Lesefunktionsaufruf?

Die C-Standardbibliotheksfunktion kann unter 64-Bit-Linux nicht aus Assemblycode (yasm) aufgerufen werden

Was tun, wenn Strg + C einen Prozess nicht beenden kann?