Scroll to navigation

STATFS(2) Руководство программиста Linux STATFS(2)

ИМЯ

statfs, fstatfs - получить статистику по файловой системе

ОБЗОР

#include <sys/vfs.h> /* или <sys/statfs.h> */

int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);

ОПИСАНИЕ

Функция statfs() возвращает информацию о смонтированной файловой системе. В аргументе path указывается путь к любому файлу, расположенному в смонтированной файловой системе. Аргумент buf представляет собой указатель на структуру statfs, определённую примерно следующим образом:


#if __WORDSIZE == 32		/* размер слова в системе */
# define __SWORD_TYPE		int
#else /* __WORDSIZE == 64 */
# define __SWORD_TYPE		long int
#endif
struct statfs {

__SWORD_TYPE f_type; /* тип файловой системы (см. далее) */
__SWORD_TYPE f_bsize; /* оптимальный размер блока передачи */
fsblkcnt_t f_blocks; /* общее количество блоков в ФС */
fsblkcnt_t f_bfree; /* свободных блоков в ФС */
fsblkcnt_t f_bavail; /* свободных блоков, доступных
обычному пользователю */
fsfilcnt_t f_files; /* общее количество файловых нод в ФС */
fsfilcnt_t f_ffree; /* свободных файловых нод в ФС */
fsid_t f_fsid; /* ID файловой системы */
__SWORD_TYPE f_namelen; /* максимальная длина имени файла */
__SWORD_TYPE f_frsize; /* размер фрагмента (начиная с Linux 2.6) */
__SWORD_TYPE f_spare[5]; }; Типы файловых систем:
ADFS_SUPER_MAGIC 0xadf5
AFFS_SUPER_MAGIC 0xADFF
BEFS_SUPER_MAGIC 0x42465331
BFS_MAGIC 0x1BADFACE
CIFS_MAGIC_NUMBER 0xFF534D42
CODA_SUPER_MAGIC 0x73757245
COH_SUPER_MAGIC 0x012FF7B7
CRAMFS_MAGIC 0x28cd3d45
DEVFS_SUPER_MAGIC 0x1373
EFS_SUPER_MAGIC 0x00414A53
EXT_SUPER_MAGIC 0x137D
EXT2_OLD_SUPER_MAGIC 0xEF51
EXT2_SUPER_MAGIC 0xEF53
EXT3_SUPER_MAGIC 0xEF53
EXT4_SUPER_MAGIC 0xEF53
HFS_SUPER_MAGIC 0x4244
HPFS_SUPER_MAGIC 0xF995E849
HUGETLBFS_MAGIC 0x958458f6
ISOFS_SUPER_MAGIC 0x9660
JFFS2_SUPER_MAGIC 0x72b6
JFS_SUPER_MAGIC 0x3153464a
MINIX_SUPER_MAGIC 0x137F /* ориг. minix */
MINIX_SUPER_MAGIC2 0x138F /* 30 символов minix */
MINIX2_SUPER_MAGIC 0x2468 /* minix V2 */
MINIX2_SUPER_MAGIC2 0x2478 /* minix V2, имена 30 символов */
MSDOS_SUPER_MAGIC 0x4d44
NCP_SUPER_MAGIC 0x564c
NFS_SUPER_MAGIC 0x6969
NTFS_SB_MAGIC 0x5346544e
OPENPROM_SUPER_MAGIC 0x9fa1
PROC_SUPER_MAGIC 0x9fa0
QNX4_SUPER_MAGIC 0x002f
REISERFS_SUPER_MAGIC 0x52654973
ROMFS_MAGIC 0x7275
SMB_SUPER_MAGIC 0x517B
SYSV2_SUPER_MAGIC 0x012FF7B6
SYSV4_SUPER_MAGIC 0x012FF7B5
TMPFS_MAGIC 0x01021994
UDF_SUPER_MAGIC 0x15013346
UFS_MAGIC 0x00011954
USBDEVICE_SUPER_MAGIC 0x9fa2
VXFS_SUPER_MAGIC 0xa501FCF5
XENIX_SUPER_MAGIC 0x012FF7B4
XFS_SUPER_MAGIC 0x58465342
_XIAFS_SUPER_MAGIC 0x012FD16D

Значение f_fsid до конца не определено (но смотрите далее).

Если поле отсутствует в файловой системе, то его значение устанавливается в 0. Вызов fstatfs() возвращает ту же информацию об открытом файле, на который ссылается дескриптор fd.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

(statfs()) В одном из каталогов префикса пути path не разрешён поиск (см. также path_resolution(7)).
(fstatfs()) fd не является корректным открытым дескриптором файла.
Аргумент buf или path указывает на неправильный адрес.
Данный вызов был прерван сигналом.
При чтении файловой системы произошла ошибка ввода-вывода.
(statfs()) Было обнаружено слишком много символьных ссылок при трансляции path.
(statfs()) Слишком длинное значение аргумента path.
(statfs()) Файл, на который ссылается path, не существует.
Недостаточное количество памяти ядра.
Файловая система не поддерживает данный вызов.
(statfs()) Компонент в префиксе пути path не является каталогом.
Некоторые значения слишком велики, чтобы быть представленными в возвращаемой структуре.

СООТВЕТСТВИЕ СТАНДАРТАМ

Есть только в Linux. Вызов statfs() основан на подобном из 4.4BSD (но они используют разные структуры).

ЗАМЕЧАНИЯ

Первые версии системных вызовов Linux statfs() и fstatfs() разрабатывались без учёта огромных размеров файлов. В последствии, в Linux 2.6 были добавлены системные вызовы statfs64() и fstatfs64(), в которых используется новая структура, statfs64. Новая структура содержит те же поля что и первоначальная структура statfs, но размеры некоторых полей были увеличены для учёта огромных размеров файлов. Обёрточные функции в glibc statfs() и fstatfs() прозрачно скрывают это различие ядер.

В одних системах есть только файл <sys/vfs.h>, в других также есть файл <sys/statfs.h>, при чём первый включает последний. Поэтому, вероятно, лучше включать первый.

В LSB библиотечные вызовы statfs() и fstatfs() помечены как устаревшие, вместе них предлагается использовать statvfs(2) и fstatvfs(2).

Поле f_fsid

В Solaris, Irix и POSIX имеется системный вызов statvfs(2), который возвращает struct statvfs (определена в <sys/statvfs.h>), и в ней содержится поле unsigned long f_fsid. В Linux, SunOS, HP-UX, 4.4BSD имеется системный вызов statfs(), который возвращает struct statfs (определена в <sys/vfs.h>), и в ней содержится fsid_t f_fsid, где тип fsid_t определён как struct { int val[2]; }. Того же придерживается FreeBSD, за исключением того, что в ней используется включаемый файл <sys/mount.h>.

Общая идея в том, что в f_fsid содержится какая-то произвольная информация, например пара (f_fsid,ino) уникально определяющая файл. В некоторых операционных системах для этого используется номер устройства (один из вариантов) или номер устройства вместе с типом файловой системы. В других ОС поле f_fsid доступно только суперпользователю (и равно нулю для остальных пользователей), так как это поле используется в файловом указателе (filehandle) файловой системы при экспорте NFS, и выдача его значения влияет на безопасность.

В некоторых ОС fsid может использоваться в качестве второго аргумента системного вызова sysfs(2).

СМОТРИТЕ ТАКЖЕ

stat(2), statvfs(2), path_resolution(7)

2010-11-21 Linux