Linux программирование в примерах
Шрифт:
Таблица 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
.
61 /* do_statvfs --- Использовать statvfs и вывести сведения */
62
63 void do_statvfs(const struct mntent *fs)
64 {
65 struct statvfs vfs;
66
67 if (fs->mnt_fsname[0] != '/') /* пропустить ненастоящие файловые системы */
68 return;
69
70 if (statvfs(fs->mnt_dir, &vfs) != 0) {
71 fprintf(stderr, "%s: %s: statvfs failed: %s\n",
72 myname, fs->mnt_dir, strerror(errno));
73 errors++;
74 return;
75 }
76
77 printf("%s, mounted on %s:\n", fs->mnt_dir, fs->mnt_fsname);
78 printf("\tf_bsize: %ld\n", (long)vfs.f_bsize);
79 printf("\tf_frsize: %ld\n", (long)vfs.f_frsize);
80 printf("\tf_blocks: %lu\n", (unsigned long)vfs.f_blocks);
81 printf("\tf_bfree: %lu\n", (unsigned long)vfs.f_bfree);
82 printf("\tf_bavail: %lu\n", (unsigned long)vfs.f_bavail);
83 printf("\tf_files: %lu\n", (unsigned long)vfs.f_files);
84 printf("\tf_ffree: %lu\n", (unsigned long)vfs.f_ffree);
85 printf("\tf_favail: %lu\n", (unsigned long)vfs.f_favail);
Поделиться с друзьями: