Gibt es einen Unterschied zwischen den on_exit() und atexit() Funktionen?

StackOverflow https://stackoverflow.com/questions/10680

  •  08-06-2019
  •  | 
  •  

Frage

Gibt es einen Unterschied zwischen

   int on_exit(void (*function)(int , void *), void *arg);

und

   int atexit(void (*function)(void));

andere als die Tatsache, dass die Funktion verwendet die von on_exit wird der exit-status?

Das ist, wenn ich don ' T care über den exit-status, gibt es aus irgendeinem Grund eine oder das andere?

Edit: Viele der Antworten, warnte vor on_exit weil es ist nicht-standard.Wenn ich eine app zu entwickeln, die für die unternehmensinterne Verwendung und garantiert die Ausführung auf bestimmte Konfigurationen, muss ich mir sorgen über diese?

War es hilfreich?

Lösung

Nach diesen link Ich fand, es scheint, es gibt ein paar Unterschiede. on_exit lassen Sie übergeben ein argument, das übergeben wird, um die on_exit Funktion, wenn es aufgerufen wird...die könnte lassen Sie setzen up einige Hinweise, um einige Aufräumarbeiten auf, wenn es Zeit ist, zu beenden.

Darüber hinaus scheint es, dass on_exit war SunOS spezifische Funktion, dass kann nicht werden kompatibel auf allen Plattformen...so möchten Sie vielleicht zu halten mit atexit, trotz restriktiver.

Andere Tipps

Sollten Sie benutzen atexit() wenn möglich. on_exit() ist flippig und weniger Häufig.Für Beispiel, es ist nicht verfügbar für OS X.

Kernel.org - on_exit():

Diese Funktion kommt von SunOS 4, aber auch in libc4, libc5 und glibc.Es tritt nicht mehr in Solaris (SunOS 5).Vermeiden Sie diese Funktion, und verwenden Sie die standard-atexit(3) statt.

Der Unterschied ist, dass atexit C und on_exit einige seltsame Erweiterung zur Verfügung, die auf GNU und wer-weiß-was-andere Unixy-Systeme (aber NICHT Teil des POSIX).

@Nathan, ich finde keine Funktion, die Rückkehr der exit-code für den Laufenden Prozess.Ich erwarte, dass es nicht doch an der Stelle, wenn atexit() genannt wird, sowieso.Damit meine ich, dass die Laufzeitumgebung weiß, was es ist, aber wahrscheinlich noch nicht gemeldet OS.Dies ist so ziemlich nur eine Vermutung, aber.

Wie es aussieht, werden Sie entweder verwenden müssen on_exit() oder strukturieren Sie Ihr Programm so, dass der exit-code ist egal.Es wäre nicht unvernünftig, wenn die Letzte Anweisung in der main-Funktion eine Globale flip exited_cleanly variable auf true.In der Funktion, die Sie registrieren mit atexit(), man könnte diese variable überprüfen, um zu bestimmen, wie das Programm beendet wird.Dies wird Ihnen nur zwei Staaten, aber ich erwarte, dass wäre ausreichend für die meisten Bedürfnisse.Sie könnten auch erweitern diese Art von Schema zu Unterstützung mehr exit-Staaten, wenn notwendig.

@Nathan

Zunächst sehen, wenn es einen anderen API-Aufruf, um zu bestimmen, exit-status...ein kurzer Blick und ich sehe nicht ein, aber ich bin nicht sehr versiert in der standard-C-API.

Eine einfache alternative ist eine Globale variable, in der der exit-status...der Standard ist ein unbekannter Fehler Ursache (für wenn das Programm beendet wird).Dann, wenn Sie den Anruf beenden, können Sie speichern Sie die exit-status in der globalen und abrufen von beliebigen atexit-Funktionen.Dies erfordert eine Speicherung der exit-status fleißig vor jeder Ausfahrt rufen, und klar ist es nicht ideal, aber wenn es keine API und Sie nicht riskieren wollen on_exit nicht auf der Plattform...es könnte die einzige Möglichkeit sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top