fwrite не дает сбоя, когда диск заполнен?
Вот тестовая программа, которую я написал
int main( int argc, const char* argv[] )
{
const char name[1024] = "/dev/shm/test_file";
off_t len = atol(argv[argc - 1]);
char buf[1024];
FILE * f = fopen(name, "w");
for (int i = 0; i < len; i++) {
int ret = fwrite(buf, 1024, 1, f);
if (ret != 1) {
printf("disk full\n");
}
}
if ( fclose(f) != 0)
printf("failed to close\n");
return 0;
}
Я пытался заполнить /dev/shm почти до полного
tmpfs 36G 36G 92K 100% /dev/shm
и побежал
$ ./a.out 93
failed to close
мой бойкий
$ /lib/libc.so.6
GNU C Library stable release version 2.12, by Roland McGrath et al.
версия ядра 2.6.32-642.13.1.el6.x86_64
Я понимаю, что такое поведение вызвано попыткой fwrite кешировать данные в памяти. (Я попробовал setvbuf(NULL...) и fwrite немедленно вернуть ошибку). Но это, кажется, немного отличается от определения
Функция fwrite() должна возвращать количество успешно записанных элементов, которое может быть меньше nitems, если возникла ошибка записи. Если size или nitems равен 0, fwrite() должен вернуть 0, а состояние потока остается неизменным. В противном случае, если происходит ошибка записи, должен быть установлен индикатор ошибки для потока, [CX] [Option Start] и errno должны быть установлены для указания ошибки. [Вариант Конец]
Данные не были успешно записаны на диск, однако их возвращаемое значение равно 1. нет. В этом тестовом примере fclose перехватывает ошибку. Но это может быть поймано даже функцией ftell, которая довольно запутанная.
Мне интересно, происходит ли это со всеми версиями glibc и будет ли это ошибкой?
1 ответ
Данные не были успешно записаны на диск
Стандарт не говорит о диске. Он говорит о том, что данные были успешно записаны в поток (каким он был).
Мне интересно, если это произойдет со всеми версиями Glibc
Более вероятный.
и будет ли это считать ошибкой.
Это ошибка в вашей интерпретации требований к fwrite
,