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

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

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

3 ответов


Истерика Изюм


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

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

statfs() специфичен для ОС

statvfs() - это POSIX-соответствие

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

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


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


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

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