Heim  >  Artikel  >  Backend-Entwicklung  >  Nennen Sie die Unterschiede zwischen den Funktionen „exit“, „return“, „_exit“ und „_Exit“.

Nennen Sie die Unterschiede zwischen den Funktionen „exit“, „return“, „_exit“ und „_Exit“.

伊谢尔伦
伊谢尔伦Original
2016-11-26 10:18:131231Durchsuche

1. Der Hauptunterschied zwischen der Exit-Funktion und der Return-Funktion ist:

Exit wird verwendet, um das Programm jederzeit zu beenden, während das Programm ausgeführt wird, und seine Parameter werden an das Betriebssystem zurückgegeben. Man kann auch sagen, dass die Exit-Funktion die Anwendung beendet und einen Status der Anwendung an das Betriebssystem zurückgibt. Dieser Status identifiziert einige laufende Informationen der Anwendung.

Die Exit-Funktion wird auch implizit aufgerufen, wenn die Hauptfunktion endet. Wenn die Exit-Funktion ausgeführt wird, führt sie zuerst die von der atexit()-Funktion registrierte Funktion aus und führt dann selbst einige Reinigungsarbeiten durch und alle Ausgabestreams gleichzeitig aktualisieren. Schließt alle geöffneten Streams und schließt temporäre Dateien, die über die Standard-E/A-Funktion tmpfile() erstellt wurden.

exit ist eine Systemaufrufebene. Sie zeigt das Ende eines Prozesses an. Sie löscht den vom Prozess verwendeten Speicherplatz und gibt Fehlerinformationen an den übergeordneten Prozess zurück. Normalerweise: Exit (0) zeigt an, dass das Programm normal ist, Exit (1) und Exit (-1) zeigen an, dass das Programm abnormal beendet wurde, und Exit (2) zeigt an, dass das System die angegebene Datei nicht finden kann.

Rückgabe ist die Sprachebene und stellt die Rückkehr des Aufrufstapels dar. Die Rückgabe dient dazu, den Funktionswert zurückzugeben und die Funktion zu verlassen. Normalerweise bedeutet 0 einen normalen Ausgang, nicht 0 bedeutet einen abnormalen Ausgang. Bitte beachten Sie, dass dies der Fall ist Befindet sich in der Hauptfunktion main, wird der aktuelle Prozess natürlich beendet (d. h. in main() können Sie return n verwenden, oder Sie können exit(n) direkt verwenden, um dies zu tun). es kehrt zum vorherigen Ebenenaufruf zurück. Wenn mehrere Prozesse vorhanden sind und Sie manchmal feststellen möchten, ob der vorherige Prozess normal beendet wurde, müssen Sie den Rückgabewert des vorherigen Prozesses verwenden.

2. Prozessumgebung und Prozesssteuerung

Wenn Exit(int n) in der Hauptfunktion aufgerufen wird, beendet Exit(int n) das Programm direkt und gibt einen Wert vom Typ int zurück. Im Allgemeinen führen Sie unter der Shell ein Programm aus und verwenden dann den Befehl echo $?, um den Rückgabewert des Programms abzurufen, der den Exit-Wert darstellt. Theoretisch kann Exit jede ganze Zahl kleiner als 256 zurückgeben. Die unterschiedlichen zurückgegebenen Werte sind hauptsächlich auf unterschiedliche Verarbeitungen durch den Aufrufer zurückzuführen.

Der Rückgabewert von Exit für einen einzelnen Prozess wird an das Betriebssystem zurückgegeben. Wenn jedoch mehrere Prozesse vorhanden sind, wird er an den übergeordneten Prozess zurückgegeben. Rufen Sie Funktionen wie waitpid() im übergeordneten Prozess auf, um den Exit-Status des untergeordneten Prozesses für unterschiedliche Verarbeitungen abzurufen. Lassen Sie den Anrufer die entsprechende Verarbeitung gemäß dem entsprechenden Rückgabewert durchführen.

Exit (int n) bedeutet im Allgemeinen, dass der aktuelle Prozess seine Kontrolle an das Hauptprogramm zurückgibt, das die Unterroutine aufgerufen hat. Der Rückgabewert in Klammern teilt dem aufrufenden Programm den laufenden Status des Programms mit.

1. Der Beginn des Prozesses:

Das C-Programm startet die Ausführung von der Hauptfunktion und der Prototyp lautet wie folgt:

int main(int argc, char *argv[]);

Normalerweise der Rückgabewert von main ist vom Typ int und es wird korrekt 0 zurückgegeben.

2. Prozessbeendigung:

Die Beendigung des C-Programms ist in zwei Arten unterteilt: normale Beendigung und abnormale Beendigung.

Die normale Beendigung ist unterteilt in: return, exit, _exit, _Exit, pthreade_exit.

Ausnahme Mittelfinger ist unterteilt in: Abbruch, SIGNAL, Thread-Antwort-Abbruch.

Sprechen Sie hauptsächlich über die ersten vier Arten der normalen Beendigung, dh die Exit-Funktionsreihe

#include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status);

Der Unterschied zwischen den oben genannten drei Funktionen ist:

exit() (oder return 0) ruft den Beendigungshandler und das Standard-E/A-Bereinigungsprogramm des Benutzerbereichs (z. B. fclose) auf, während _exit und _Exit nicht aufgerufen werden und direkt vom Kernel zur Bereinigung übernommen werden. Daher entspricht Exit(0) in der Hauptfunktion der Rückgabe 0.

3. atexit-Termination-Handler:

ISO C schreibt vor, dass ein Prozess bis zu 32 Termination-Handler-Funktionen registrieren kann. Diese Funktionen werden beim Exit automatisch in der umgekehrten Reihenfolge der Registrierung aufgerufen. Wenn dieselbe Funktion mehrmals registriert ist, wird sie auch mehrmals aufgerufen.

Der Prototyp lautet wie folgt:

#include 8e359799bdf1a571032ba13cc96acda9

其中参数是一个函数指针, 指向终止处理函数, 该函数无参无返回值。atexit函数本身成功调用后返回0。

以下面的程序为例:

#include <stdlib.h> static void myexit1()
{ printf("first exit handlern");
} static void myexit2()
{ printf("second exit handlern");
} int main()
{
atexit(my_exit2);
atexit(my_exit1);
atexit(my_exit1); printf("main is donen"); return 0; // 相当于exit(0) }

运行结果:

$ ./a.out
main is done first exit handler first exit handler second exit handler

main函数结束时也会隐式地调用exit函数,exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。

注意上面程序的结果,可以发现这些函数由exit按登记相反的顺序自动调用(先myexit1后myexit2)。如果同一函数登记多次, 也会被调用多次(如这里的myexit1)。

而这些处理函数都是在程序退出的时候利用atexit函数调用了这些处理函数。但是如果用_exit()退出程序,则它不关闭任何文件,不清除任何缓冲器、也不调用任何终止函数!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn