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 |