В случае успеха оба вызова возвращают значение 0. В случае сбоя оба вызова
возвращают -1 и присваивают переменной еггпо одно из следующих трех
значений:
EBA0F
Указанный файловый дескриптор является недопустимым или не открыт
для записи.
EINVAL
Указанный файловый дескриптор соответствует объекту, пе поддерживающему
синхронизацию.
ЕЮ
Во время синхронизации произошла низкоуровневая ошибка ввода-вывода.
Это говорит о реальной ошибке ввода-вывода, и именно здесь зачастую отлавливаются
такие ошибки.
Вызов fsyncO может легко завершиться ошибкой из-за того, что fsyncO не
реализован в конкретной файловой системе, даже если fdatasyncO реализован.
В параноидальных приложениях в случае, когда fsync( ) возвращает код ошибки
EINVAL, можно пробовать делать то же самое с использованием fdatasyncO. Например:
if (fsync (fd) == -1) {
/*
* Мы предпочитаем fsyncO. но давайте попробуем fdatasync( ) на
* случай, если fsync( ) не сработает, просто для гарантии
*/
if (еггпо == EINVAL) {
if (fdatasync (fd) == -1)
perror ("fdatasync").
} else
perror ("fsync").
}
Так как POSIX требует использования fsync( ) и считает fdatasync() необязательным
вызовом, системный вызов fsync () всегда должен реализовываться для
обычных файлов во всех распространенных файловых системах Linux. Однако
для необычных типов файлов (тех, в которых нет метаданных, требующих синхронизации)
или странных файловых систем можно реализовывать только
fdatasync().