Разница между системными вызовами statvfs() и statfs()?

Почему statfs() и statvfs() вызовы существуют, если они так похожи?

В каких обстоятельствах я бы предпочел бы один над другим?

Ответы

Ответ 1

Истерические изюмы


Err, "исторические причины".

Первоначально 4.4BSD определил вызов statfs(). Позднее Linux реализовал несколько другой вызов с тем же именем. Posix стандартизировал его между всеми версиями freenix и Unix, определяя statvfs().

statfs() зависит от ОС

statvfs() соответствует позициям

Поскольку все они возвращают несколько разные структуры, более поздние из них не могут заменить первый.

В общем вы должны использовать statvfs(), Posix. Однако будьте осторожны с рекомендацией "использовать Posix", так как в некоторых случаях (например, pty) BSD (или что-то другое) более переносимо на практике.

Ответ 2

Если вам нужна только емкость файловой системы и информация об использовании, другие ответы верны: предпочитайте statvfs, потому что это стандартный POSIX и лучше обрабатывает большие размеры файлов. statfs - это BSD- и Linux-специфические, с разными структурами на каждом. (Linux 2.6 добавил новые системные вызовы statfs64 и fstatfs64, которые используют расширенную структуру для обработки больших размеров.) Однако statfs по-прежнему полезен для Linux для определения типа файловой системы (при условии, что вы в порядке с написанием кода, специфичного для Linux).

Ответ 3

statfs() устарел в пользу statvfs(), который значительно лучше справляется с большой поддержкой файлов. statfs(), как известно, делает нечетные вещи для размеров, которые превышают значение unsigned long.

Насколько я могу сказать (и помню), statvfs() существует со времен Redhat 7.3, сразу после введения в качестве замены POSIX. Вероятно, вы найдете его в большинстве современных систем.