table of contents
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 устанавливается в соответствующее значение.
ОШИБКИ¶
- EACCES
- (statfs()) В одном из каталогов префикса пути path не разрешён поиск (см. также path_resolution(7)).
- EBADF
- (fstatfs()) fd не является корректным открытым дескриптором файла.
- EFAULT
- Аргумент buf или path указывает на неправильный адрес.
- EINTR
- Данный вызов был прерван сигналом.
- EIO
- При чтении файловой системы произошла ошибка ввода-вывода.
- ELOOP
- (statfs()) Было обнаружено слишком много символьных ссылок при трансляции path.
- ENAMETOOLONG
- (statfs()) Слишком длинное значение аргумента path.
- ENOENT
- (statfs()) Файл, на который ссылается path, не существует.
- ENOMEM
- Недостаточное количество памяти ядра.
- ENOSYS
- Файловая система не поддерживает данный вызов.
- ENOTDIR
- (statfs()) Компонент в префиксе пути path не является каталогом.
- EOVERFLOW
- Некоторые значения слишком велики, чтобы быть представленными в возвращаемой структуре.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
Есть только в 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).
СМОТРИТЕ ТАКЖЕ¶
2010-11-21 | Linux |