unsigned long int f_frsize
Некоторые файловые системы (такие, как BSD Fast Filesystem) проводят различие между блоками и фрагментами блоков. Небольшие файлы, общий размер которых меньше размера блока, находятся в некотором числе фрагментов. Это позволяет избежать пустой потери дискового пространства (за счет допустимой цепы большей сложности кода ядра). Размер фрагмента выбирается во время создания файловой системы.
fsblkcnt_t f_blocks
Общее число блоков (в единицах f_bsize) в файловой системе.
fsblkcnt_t f_bfree
Общее число свободных блоков в файловой системе.
fsblkcnt_t f_bavail
Число блоков, которые действительно могут использоваться. Некоторые файловые системы резервируют часть блоков файловой системы для использования суперпользователем при заполнении файловой системы. Современные системы резервируют около 5 процентов, хотя это число может быть изменено администратором. (См. tune2fs(8) на системе GNU/Linux и tunefs(8) на системах Unix.)
fsfilcnt_t f_files
Общее число индексов («порядковых номеров файлов» на языке POSIX) в файловой системе. Это число обычно инициализируется и делается постоянным при создании файловой системы.
fsfilcnt_t f_ffree
Общее число свободных узлов.
fsfilcnt_t f_favail
Число индексов, которые действительно могут быть использованы. Некоторая часть индексов резервируются для суперпользователя, точно так же, как для блоков.
unsigned long int f_fsid
ID файловой системы. POSIX не определяет, что оно представляет, и это под Linux не используется.
unsigned long int f_flag
Флаги, дающие информацию о файловой системе. POSIX определяет два флага: ST_RDONLY для файловых систем только для чтения (таких, как CD-ROM) и ST_NOSUID, который запрещает использование битов setuid и setgid в исполняемых файлах. Системы GNU/Linux предусматривают дополнительные флаги: они перечислены в табл. 8.2.
Таблица 8.2. Значения GLIBC для f_flag
| Флаг | POSIX | Значение |
|---|---|---|
ST_MANDLOCK |
Осуществляет принудительное блокирование (см. раздел 14.2). | |
ST_NOATIME |
Не обновлять при каждом доступе время доступа | |
ST_NODEV |
Запрещает доступ через файлы устройств | |
ST_NODIRATIME |
Не обновлять поле времени доступе каталогов | |
ST_NOEXEC |
Запрещает исполнение двоичных файлов | |
ST_NOSUID |
√ | Файловая система запрещает использование битов setuid и setgid. |
ST_RDONLY |
√ | Файловая система только для чтения. |
ST_SYNCHRONOUS |
Любая запись осуществляется синхронно (см. раздел 4.6.3). |
unsigned long int f_namemax
Максимальная длина имени файла. Это относится к каждому отдельному компоненту в имени пути; другими словами, максимальная длина для элемента каталога
Типы fsblkcnt_t и fsfilcnt_t определены в <sys/types.h>. Они обычно являются unsigned long, но на современных системах они могут быть даже 64-разрядными, поскольку диски стали очень большими. Следующая программа, ch08-statvfs.c, показывает, как использовать statvfs():
1 /* ch08-statvfs.с --- демонстрация statvfs */
2
3 /* ЗАМЕЧАНИЕ: специфично для GNU/Linux! */
4
5 #include <stdio.h>
6 #include <errno.h>
7 #include <mntent.h> /* для getmntent(), et al. */
8 #include <unistd.h> /* для getopt() */
9 #include <sys/types.h>
10 #include <sys/statvfs.h>
11
12 void process(const char *filename);
13 void do_statvfs(const struct mntent *fs);
14
15 int errors = 0;
16 char *myname;
17
18 /* main --- обработка опций */
19
20 int main(int argc, char **argv)
21 {
22 int c;
23 char *file = "/etc/mtab"; /* файл для чтения по умолчанию */
24
25 myname = argv[0];
26 while ((c = getopt(argc, argv, "f:")) != -1) {
27 switch (c) {
28 case 'f':
29 file = optarg;
30 break;
31 default:
32 fprintf(stderr, "usage: %s [-f fstab-file]\n", argv[0]);
33 exit(1);
34 }
35 }
36
37 process(file);
38 return (errors != 0);
39 }
40
41 /* process --- чтение структур struct mntent из файла */
42
43 void process(const char *filename)
44 {
45 FILE* fp;
46 struct mntent *fs;
47
48 fp = setmntent(filename, "r"); /* только для чтения */
49 if (fp == NULL) {
50 fprintf(stderr, "%s: %s: could not open: %s\n",
51 myname, filename, strerror(errno));
52 exit(1);
53 }
54
55 while ((fs = getmntent(fp)) != NULL)
56 do_statvfs(fs);
57
58 endmntent(fp);
59 }
Строки 1–59 в сущности те же самые, как и для ch08-mounted.c. main() обрабатывает командную стоку, a process() просматривает в цикле каждую смонтированную файловую систему. do_statvfs() осуществляет действительную работу, выводя для каждой интересующей файловой системы struct statvfs.