main関数の後の呼び出し

1449 ワード

main関数はプロセスのメインスレッドを表します.プログラムが実行を開始すると、システムはプログラムのためにプロセスを作成し、main関数は実際には最初に呼び出された関数ではなく、オペレーティングシステムがC/C++ランタイム起動関数を呼び出し、この関数はC/C++ランタイムライブラリの初期化を担当します.また、宣言されたグローバルオブジェクトと静的オブジェクトがコード実行前に正しく作成されることを保証します.
これらの作業が完了すると、アクセスポイント関数(コンソールプログラムはmain関数)を呼び出し、main関数で一連の操作を実行します.
main関数の実行が完了したら、mian関数から戻り、関数を起動してC実行期間のexit()関数を呼び出し、戻り値を渡します.ここでexit()でExitProcess()関数が呼び出され、プロセスが終了します.
プログラム終了時にはリソースを解放するなどの操作が必要になることが多いが、プログラム終了の方法としてはmain()関数の実行終了、プログラムのどこかでexit()でプログラムを終了、ユーザがCtrl+Cなどの操作でプログラムを終了するなど、多くの種類がある.したがって,プログラム終了方式に関係なくプログラム終了時の必要な処理を行う方法が必要である.atexit()関数は、プログラムが正常に終了したときに呼び出される関数を登録するために使用されます.(異常終了は呼び出されず、例えば受信信号)
atexit()関数のパラメータは関数ポインタであり、関数ポインタはパラメータも戻り値もない関数を指す.atexit()の関数プロトタイプは次のとおりです.
int atexit(void(*)(void));

1つのプログラムでは、最大32個の処理関数をatexit()で登録することができ、これらの処理関数の呼び出し順序は、登録された順序とは逆、すなわち、最初に登録された最後の呼び出し、最後に登録された最初の呼び出しである.
#include<stdio.h>
#include<stdlib.h>

void fn1()
{
    printf("calling fn1()....
"); } void fn2() { printf("calling fn2()....
"); } int main() { atexit(fn1); // atexit fn1() atexit(fn2); // atexit fn2() printf("main exit...
"); return 0; }

実行結果:
main exit...
calling fn2()....
calling fn1()....

説明プログラムが正常に終了したときに呼び出される関数をatexit()関数で登録し、main()関数が終了したときに呼び出される関数の順序は、登録される順序とは逆です.