1

質問をより明確にするために:

【ケース1】

#include <stdio.h>
int main ()  {
    FILE* file = fopen("myfile.txt", "r");
    return 0;
}

【事例2】

#include <stdio.h>
int main () {
    int fd = open("myfile.txt", O_RDONLY);
    return 0;
}

両方の例でフ​​ァイルが適切に閉じられていないとどうなりますか? バッファはファイルにフラッシュされていますか? ファイルは少なくとも自動的に閉じられると思います...そうですか?

4

2 に答える 2

3

fopenCライブラリ関数です。それがどのように実装されるかは特定されていません。[訂正: ]から戻るとmain、開いているすべてのファイルストリームが閉じられます(例:C11 7.21.3 / 5)が、プログラムが他の方法(例:viaなどの信号経由abort)で終了する場合は、これを行う必要はありません。

もちろん、基盤となるOS実装は、プロセスが終了したときにすべてを適切にクリーンアップしますが、それはシステムのグローバル状態に関する限りです(たとえば、プロセスに関連付けられたすべての仮想メモリが解放され、すべてのファイル記述子が閉じられます。等。)。たとえば、Cライブラリが独自の書き込みバッファを実装している場合、それがすべての状況で自動的にフラッシュされる理由はありません(ただし、から戻ることによる通常の終了mainは問題ありません)。

これは、ケース2にも対応します。Posixopen呼び出しのようにOS機能を直接使用する場合は、プロセスの終了時にこれらのファイル記述子が閉じられることが実際に保証されます。

于 2012-09-02T12:07:53.967 に答える
3

はい。開いているファイルはすべて、プログラムが終了する前に閉じられます。

(C99、7.19.3p5)「main関数が元の呼び出し元に戻った場合、またはexit関数が呼び出された場合、プログラムが終了する前に、開いているすべてのファイルが閉じられます(したがって、すべての出力ストリームがフラッシュされます)。」

于 2012-09-02T12:07:59.980 に答える