2

fwrite()ストリームを閉じた後に成功する奇妙な動作に遭遇しましたが、ファイルは失敗fclose()として上書きされません。fflush()

私のコードは次のとおりです。

int main(int argc, char* argv[])
{
   FILE* file = fopen("file.txt", "w");
   if(!file) perror("Cannot open the file.\n");

    char text[] = "1234567";

    fclose(file);

    int count_of_written_objects = fwrite(text, sizeof(text),1, file);
    printf("Count of written objects into the file: %d \n", count_of_written_objects);

    if(count_of_written_objects != 1) perror("Not expected count of objects was written.\n");

    int success = fflush(file);
    printf("Variable success: %d \n", success);                                                                                                                
    if(success == EOF) perror("Flush did not succeed. \n");

    return 0;
}

次の出力が得られます。

Count of written objects into the file: 1 
Variable success: -1 
Flush did not succeed. 
: Bad file descriptor

fwrite()ストリームが閉じられたときにどのように成功できますか? fwrite()閉じたストリームに書き込みできますか? 説明していただけますか?

4

1 に答える 1

6

ファイルが閉じられた後にファイルに対して何らかの操作を行おうとすると、未定義の動作に対処しています。

ライブラリの実装者は、特定の順序で呼び出しを発行するのは呼び出し元の責任であると想定しているため、ライブラリはそれが正しくない場合を検証しようとする場合としない場合があります。このような場合の検証は、ほとんどの場合、パフォーマンスとコード サイズの削減のために無視されます。

free以前に'd'されたメモリ位置に書き込もうとすると、同じことが起こります。すべてが正しく機能しているように見えても、未定義の動作を呼び出しています。

fclose技術的に言えば、特定のケースでは、ライブラリ関数が基になる記述子でシステム コールを呼び出す可能性が最も高く、その記述子へcloseの後続のwriteシステム コール (最終的に によって呼び出されるfwrite) が失敗するため、書き込みが成功する可能性はありません。カーネルによって拒否されるためです。

于 2014-05-30T12:05:46.020 に答える