Причина, по которой последующие операции fflush () завершаются успешно, заключается в том, что нет (новых) данных для записи на диск. Первый fflush () не удался; это трагично, но история. Последующий fflush () не имеет ничего общего, поэтому он делает это успешно.
Если вы пишете в базу данных, вы должны быть осторожны с каждой записью, а не просто решать проблемы в конце. В зависимости от того, насколько важны ваши данные, вам может потребоваться выполнить все виды вращений для решения проблем - есть причины, по которым СУБД являются сложными, и одна из них - неудачные записи.
Одним из способов решения этой проблемы является предварительное выделение места для данных. Как уже отмечали другие, классические файловые системы Unix допускают разреженные файлы (файлы, в которых есть пустые блоки без выделенного для них дискового пространства), поэтому вам действительно нужно записать некоторые данные на каждую страницу, которую вам нужно выделить. Тогда вам нужно беспокоиться только о проблемах с заполнением диска, когда вы расширяете пространство - и вы знаете, когда вы делаете это, и вы можете тщательно справиться с этой ошибкой.
В системах на основе Unix существует множество системных вызовов, которые могут помочь вам синхронизировать данные на диске, а также варианты «открытия» и т. Д. К ним относятся «O_DSYNC» и связанные значения. Однако, если вы расширяете файл, они все равно могут вызвать сбои из-за нехватки места, даже с необычными опциями синхронизации. И когда вы столкнетесь с этой ошибкой, вам придется подождать, пока пространство не станет доступным (потому что вы попросили пользователя сообщить вам, когда оно будет доступно, возможно), а затем попытаться выполнить запись снова.