プログラムが実行されている限り、ファイルを閉じずに開き続けると、プロセスで使用できるファイル記述子/ハンドルが不足し、さらにファイルを開こうとすると最終的に失敗する可能性が最も高くなります。Windows では、これにより、開いているファイルを他のプロセスが開いたり削除したりすることもできなくなります。これは、デフォルトでは、ファイルは他のプロセスが開くことを防ぐ排他的共有モードで開かれるためです。
プログラムが終了すると、オペレーティング システムがクリーンアップします。プロセスを終了するときに開いたままにしたファイルを閉じ、必要なその他のクリーンアップを実行します(たとえば、ファイルがクローズ時に削除とマークされている場合、ファイルを削除します。そのようなことはプラットフォームであることに注意してください-明確な)。
ただし、注意すべきもう 1 つの問題は、バッファリングされたデータです。ほとんどのファイル ストリームは、データをディスクに書き込む前にメモリにバッファリングします。FILE*
stdio ライブラリのストリームを使用している場合、2 つの可能性があります。
- 関数を呼び出すか、 (暗黙的に を呼び出す)
exit(3)
から戻ることによって、プログラムは正常に終了しました。main
exit(3)
- プログラムが異常終了しました。
abort(3)
これは、またはの呼び出し_Exit(3)
、シグナル/例外による終了などを介して行うことができます。
プログラムが正常に終了した場合、C ランタイムは、開いていたバッファリングされたストリームをフラッシュします。したがって、FILE*
フラッシュされていない に書き込まれたデータをバッファリングした場合、通常の終了時にフラッシュされます。
逆に、プログラムが異常終了した場合、バッファリングされたデータはフラッシュされません。OS は、プロセスが終了すると、「ああ、ファイル記述子を開いたままにしました。それを閉じたほうがよいでしょう」と言うだけです。プログラムがディスクに書き込むつもりでしたが、書き込まなかったランダムなデータがメモリのどこかにあることはわかりません。そのため、注意してください。