4

私は興味深い瞬間を見つけました:atexit()関数は と に対して異なる働きをbionicglibcます。次に例を示します。

#include <cstdlib>
#include <cstdio>
extern "C" {
    void one(){
    printf("one\n");
    }
    void two() {
    printf("two\n");
    atexit(one);
    }
}
int main() {
    atexit(two);
}

の結果bionic:

two

の結果glibc:

two
one

結果が異なるのはなぜですか?

4

2 に答える 2

3

atexit関数が呼び出される前に発生しない関数の呼び出しexitが成功するかどうかは未定です。

ISO C 標準、§7.22.4.2。したがって、どちらの動作も準拠しています。atexitwhileを使用して関数を確実に登録することはできませんが、そのハンドラーexitは既に実行されています。atexit

于 2012-12-25T11:40:25.373 に答える
1

この動作は規定されていません。複数の関数をatexit()複数回呼び出すように定義できますが、プログラムを既に終了している場合 (つまり、終了した場合main()) は使用しないでください。

于 2012-12-25T11:40:17.900 に答える