Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
119 for (i = 0; table[i].type != 0; i++)120 if (table[i].type == type)121 return table[i].name;122123 sprintf(unknown, "unknown type: %#x", type);124 return unknown;125 }126127 /* do_statfs --- Использовать statfs и вывести сведения */128129 void do_statfs(const struct mntent *fs)130 {131 struct statfs vfs;132133 if (fs->mnt_fsname[0] != '/') /* пропустить фиктивные файловые системы */134 return;135136 if (statfs(fs->mnt_dir, &vfs) != 0) {137 fprintf(stderr, "%s: %s: statfs failed: %sn",138 myname, fs->mnt_dir, strerror(errno));139 errors++;140 return;141 }142143 printf("%s, mounted on %s:n", fs->mnt_dir, fs->mnt_fsname);144145 printf("tf_type: %sn", type2str(vfs.f_type));146 printf("tf_bsize: %ldn", vfs.f_bsize);147 printf("tf_blocks: %ldn", vfs.f_blocks);148 printf("tf_bfree: %ldn", vfs.f_bfree);149 printf("tf_bavail: %ldn", vfs.f_bavail);150 printf("tf_files: %ldn", vfs.f_files);151 printf("tf_ffree: %ldn", vfs.f_ffree);152 printf("tf_namelen: %ldn", vfs.f_namelen);153 }Чтобы сохранить место, мы опустили
main()process ()do_statfs()do_statvfs()Строки 13–35 содержат список магических чисел файловых систем из справочной страницы statfs(2). Хотя эти числа можно получить из заголовочных файлов исходного кода ядра, это трудно (мы пробовали), а показанному здесь способу представления следовать легче. Строки 86–125 определяют
type2str()type2str()do_statfs()struct statfsf_fsidfsid_ttype2str()statvfs()$ <b>ch08-statfs</b> /* Запуск программы *//, mounted on /dev/hda2: /* Результаты для файловой системы ext2 */f_type: ЕХТ2f_bsize: 4096f_blocks: 1549609f_bfrее: 316664f_bavail: 237946f_files: 788704f_ffree: 555483f_namelen: 255.../win, mounted on /dev/hda1: /* Результаты для файловой с-мы vfat */f_type: MSDOSf_bsize: 4096f_blocks: 2092383f_bfree: 1391952f_bavail: 1391952f_files: 0f_ffree: 0f_namelen: 260В заключение, использование
statvfs()statfs()dfstatvfs()8.4. Перемещение по иерархии файлов
Несколько системных вызовов и стандартных библиотечных функций дают возможность изменять текущий каталог и определять полный путь к текущему каталогу. Более сложные функции позволяют осуществлять произвольные действия с каждым объектом файловой системы в иерархии каталогов.
8.4.1. Смена каталога:
chdir()fchdir()В разделе 1.2 «Модель процессов Linux/Unix» мы говорили:
Текущим каталогом является каталог, относительно которого отсчитываются относительные пути (те, которые не начинаются с
/cd <i>некоторое_место</i>У каждого процесса есть текущий рабочий каталог. Каждый новый процесс наследует свой текущий каталог от процесса, который его запустил (своего родителя). Две функции позволяют перейти в другой каталог:
#include <unistd.h>int chdir(const char *path); /* POSIX */