fwrite() завершился успешно после fclose()

Я столкнулся со странным поведением, которое 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() написать на закрытом потоке? Не могли бы вы объяснить это мне?

1 ответ

Решение

Пытаясь выполнить какие-либо операции с файлом после его закрытия, вы имеете дело с неопределенным поведением.

Реализатор библиотеки предполагает, что вызывающая сторона несет ответственность за выполнение вызовов в определенном порядке, поэтому библиотека может или не может попытаться проверить случаи, когда это не так. Проверка в таких случаях игнорируется в основном из-за производительности и уменьшения размера кода.

То же самое произойдет, если вы попытаетесь записать в ячейку памяти, которая была ранее free"D. Даже если может показаться, что все работает правильно, вы вызываете неопределенное поведение.

Технически говоря, в частном случае не должно быть возможности успешной записи, потому что функция библиотеки fclose скорее всего, позвонит close системный вызов базового дескриптора и любой последующий write системные вызовы этого дескриптора (в конечном итоге вызывается fwrite) должен потерпеть неудачу, потому что он будет отклонен ядром.

Другие вопросы по тегам