58 /* print_mount --- вывод одного смонтированного элемента */
59
60 void print_mount(const struct mntent *fs)
61 {
62 printf("%s %s %s %s %d %d\n",
63 fs->mnt_fsname,
64 fs->mnt_dir,
65 fs->mnt_type,
66 fs->mnt_opts,
67 fs->mnt_freq,
68 fs->mnt_passno);
69 }
В отличие от большинства программ, которые мы до сих пор видели, эта специфична для Linux. Во многих Unix-системах есть схожие процедуры, но их идентичность не гарантируется.
По умолчанию,
ch08-mounted
читает
/etc/mtab
, выводя сведения о каждой смонтированной файловой системе. Опция
– f
позволяет указать другой файл для чтения, такой, как
/proc/mounts
или даже
/etc/fstab
.
Функция
main
обрабатывает командную строку (строки 23–32) и вызывает для указанного файла
process
. (Эта программа следует нашему стандартному шаблону.)
process
, в свою очередь, открывает файл (строка 45) и проходит в цикле через каждую возвращённую файловую систему (строки 52–53). После завершения она закрывает файл (строка 55).
Вывод сведений о файловой системе, рассмотренный ранее — это хорошо и замечательно, но это не захватывает. Раз мы знаем, что определенная точка монтирования представляет файловую систему, нам нужны сведения о файловой системе. Это даст нам возможность выводить вещи наподобие сведений, полученных с помощью
df
и '
df -i
'.
$ df /* Показать свободное/используемое пространство */
Filesystem 1K-blocks Used Available Use% Mounted on
На ранних системах Unix была только одна разновидность файловой системы. Для них было достаточно, если
df
считывала суперблок каждой смонтированной файловой системы, извлекала значимые сведения и красиво форматировала их для отображения. (Суперблок обычно был вторым блоком в файловой системе; первым был загрузочный блок, содержащий загрузочный код).
Однако в современном мире такой подход был бы непригодным. POSIX предоставляет расширение XSI для получения доступа к этой информации. Главная функция называется
statvfs
(«vfs» часть происходит от лежащей в основе технологии SunOS, использованной позже в System V Release 4, которая называется виртуальной файловой системой.) Имеется две функции:
#include <sys/types.h> /* XSI */
#include <sys/statvfs.h>
int statvfs(const char *path, struct statvfs *buf);
int fstatvfs(int fd, struct statvfs *buf);
statvfs
использует для любого файла имя пути; она возвращает сведения о файловой системе, содержащей файл.
fstatvfs
принимает в качестве первою аргумента дескриптор открытого файла, здесь также возвращается информация о файловой системе, содержащей открытый файл,
struct statvfs
содержит следующие члены:
struct statvfs {
unsigned long int f_bsize; /* Размер блока */
unsigned long int f_frsize;
/* Размер фрагмента («основной размер блока») */
fsblkcnt_t f_blocks; /* Общее число блоков */
fsblkcnt_t f_bfree; /* Общее число свободных блоков */
fsblkcnt_t f_bavail; /* Число доступных блоков (≤f_bfree) */