12

printf()プログラムの終了時に関数のフラッシュがどのように機能するかを知りたいです。

次のコードを見てみましょう。

int main(int ac, char **av)
{
    printf("Hi");
    return 0;
}

この場合、どうやってprintf()そのバッファを にフラッシュできstdoutますか?

プラットフォームに依存すると思うので、Linuxを取り上げましょう。

を使用して実装できますgcc__attribute__((dtor))、標準ライブラリはコンパイラに依存します。これは機能する方法ではないと思います。

ドキュメントへの説明やリンクは大歓迎です。ありがとうございました。

4

4 に答える 4

11

C ランタイムは、が呼び出されたatexit()ときに標準バッファをフラッシュするハンドラを登録します。exit()

この説明を参照してください。

于 2013-06-21T08:14:38.700 に答える
4

プログラムが正常に終了すると、exit関数は常に標準 I/O ライブラリのクリーン シャットダウンを実行します。これにより、バッファリングされたすべての出力データがフラッシュされます。

return 0main 関数から整数値を返すことは、同じ値で exit を呼び出すことと同じです。exit(0)

_Exitまたはが呼び出された場合_exit、プロセスはすぐに終了し、IO はフラッシュされません。

于 2013-06-21T08:14:58.330 に答える
3

trofanjoe の応答を拡張するだけです。

exitは、通常のプログラム終了を引き起こします。atexit 関数は登録と逆の順序で呼び出され、開いているファイルがフラッシュされ、開いているストリームが閉じられ、制御が環境に返されます。

main内では、 return expr は exit(expr) と同等です。exit には、他の関数から呼び出すことができるという利点があります

于 2013-06-21T08:25:05.067 に答える
1

man stdioRHEL 5.8 を実行する私のマシン (強調を追加) から:

その後、同じプログラムまたは別のプログラムの実行によってファイルを再度開くことができ、その内容を再利用または変更することができます (開始時に位置を変更できる場合)。main 関数が元の呼び出し元に戻った場合、または exit(3) 関数が呼び出された場合、プログラムが終了する前に、開いているすべてのファイルが閉じられます (したがって、すべての出力ストリームがフラッシュされます)。abort(3) などの他のプログラム終了方法は、ファイルを適切に閉じることを気にしません。

于 2013-06-21T08:14:32.233 に答える