Linux программирование в примерах
fsfilcnt_t f_filesОбщее число индексов («порядковых номеров файлов» на языке POSIX) в файловой системе. Это число обычно инициализируется и делается постоянным при создании файловой системы.
fsfilcnt_t f_ffreeОбщее число свободных узлов.
fsfilcnt_t f_favailЧисло индексов, которые действительно могут быть использованы. Некоторая часть индексов резервируются для суперпользователя, точно так же, как для блоков.
unsigned long int f_fsidID файловой системы. POSIX не определяет, что оно представляет, и это под Linux не используется.
unsigned long int f_flagФлаги, дающие информацию о файловой системе. POSIX определяет два флага:
для файловых систем только для чтения (таких, как CD-ROM) иST_RDONLY, который запрещает использование битов setuid и setgid в исполняемых файлах. Системы GNU/Linux предусматривают дополнительные флаги: они перечислены в табл. 8.2.ST_NOSUIDТаблица 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>, но на современных системах они могут быть даже 64-разрядными, поскольку диски стали очень большими. Следующая программа,unsigned long, показывает, как использоватьch08-statvfs.c:statvfs()1 /* ch08-statvfs.с --- демонстрация statvfs */23 /* ЗАМЕЧАНИЕ: специфично для GNU/Linux! */45 #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>1112 void process(const char *filename);13 void do_statvfs(const struct mntent *fs);1415 int errors = 0;16 char *myname;1718 /* main --- обработка опций */1920 int main(int argc, char **argv)21 {22 int c;23 char *file = "/etc/mtab"; /* файл для чтения по умолчанию */2425 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 }3637 process(file);38 return (errors != 0);39 }4041 /* process --- чтение структур struct mntent из файла */4243 void process(const char *filename)44 {45 FILE* fp;46 struct mntent *fs;4748 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 }5455 while ((fs = getmntent(fp)) != NULL)