Разница между системными вызовами 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. Вероятно, вы найдете его в большинстве современных систем.