1. exit 関数と return 関数の主な違いは次のとおりです:
exit はプログラムの実行中にいつでもプログラムを終了するために使用され、そのパラメーターは OS に返されます。 exit 関数は、アプリケーションを終了し、アプリケーションのステータスを OS に返すとも言えます。このステータスは、アプリケーションの実行中の情報を特定します。
exit 関数は、main 関数の終了時にも暗黙的に呼び出されます。 exit 関数が実行されると、最初に atexit() 関数によって登録された関数が実行され、その後、すべての出力を更新しながら、独自のクリーニング作業が行われます。ストリームをストリームし、開いているストリームをすべて閉じます。標準 I/O 関数 tmpfile() によって作成された一時ファイルをストリームして閉じます。
exit はプロセスの終了を示し、プロセスが使用していたメモリ空間を削除し、親プロセスにエラー情報を返します。通常: exit(0) はプログラムが正常であることを示し、exit(1) と exit(-1) はプログラムが異常終了したことを示し、exit(2) はシステムが指定されたファイルを見つけられないことを示します。
return は言語レベルで、呼び出しスタックの戻りを表します。return は関数の値を返して関数を終了します。通常、0 は正常な終了で、0 以外は異常な終了です。はメイン関数 main 内にあります。これで現在のプロセスが終了します (つまり、main() 内で return n を使用するか、main 関数内にない場合は exit(n) を直接使用してそれを実行できます)。 、前の呼び出しに戻ります。複数のプロセスがある場合、前のプロセスが正常終了したかどうかを検出したい場合は、前のプロセスの戻り値を使用する必要があります。
2. プロセス環境とプロセス制御
main 関数で exit(int n) が呼び出された場合、exit(int n) はプログラムを直接終了し、int 値を返します。通常、シェルの下でプログラムを実行し、コマンド echo $? を使用してプログラムの戻り値 (終了値) を取得します。理論的には、exit は 256 未満の任意の整数を返すことができます。返されるさまざまな値は、主に呼び出し側によるさまざまな処理のためです。
exitの戻り値は、単一プロセスの場合はOSに返されますが、マルチプロセスの場合は親プロセスに返されます。親プロセスで waitpid() などの関数を呼び出して、さまざまな処理の子プロセスの終了ステータスを取得します。呼び出し元は、対応する戻り値に従って、対応する処理を実行します。
一般に、exit (int n) は、現在のプロセスがサブルーチンを呼び出したメイン プログラムに制御を返すことを意味します。括弧内の戻り値は、呼び出し側プログラムにプログラムの実行ステータスを伝えます。
1. 処理の始まり:
C プログラムは main 関数から実行を開始します。 プロトタイプは次のとおりです。
int main(int argc, char *argv[]);
通常、main の戻り値は int 型であり、正しく 0 が返されます。
2. プロセスの終了:
C プログラムの終了には、正常終了と異常終了の 2 種類があります。
正常終了はreturn、exit、_exit、_Exit、pthread_exitに分かれます。
例外中指は、中止、SIGNAL、スレッド応答キャンセルに分かれています。
主に最初の 4 種類の正常終了、つまり一連の exit 関数について説明します。
#include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status);
上記 3 つの関数の違いは次のとおりです:
exit() (または return 0) は終了ハンドラーを呼び出し、ユーザー空間の標準 I/O クリーンアップ プログラム (fclose など) ですが、_exit と _Exit は呼び出されず、クリーニングのためにカーネルによって直接引き継がれます。したがって、main 関数の exit(0) は return 0 と同等です。
3. atexit 終了ハンドラー:
ISO C では、プロセスが最大 32 個の終了ハンドラー関数を登録できると規定されています。これらの関数は登録の逆の順序で exit によって自動的に呼び出されます。同じ関数を複数登録すると、その関数も複数回呼び出されます。
プロトタイプは次のとおりです:
#include
其中参数是一个函数指针, 指向终止处理函数, 该函数无参无返回值。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()退出程序,则它不关闭任何文件,不清除任何缓冲器、也不调用任何终止函数!