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: %s\n",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: %s\n", type2str(vfs.f_type));146 printf("\tf_bsize: %ld\n", vfs.f_bsize);147 printf("\tf_blocks: %ld\n", vfs.f_blocks);148 printf("\tf_bfree: %ld\n", vfs.f_bfree);149 printf("\tf_bavail: %ld\n", vfs.f_bavail);150 printf("\tf_files: %ld\n", vfs.f_files);151 printf("\tf_ffree: %ld\n", vfs.f_ffree);152 printf("\tf_namelen: %ld\n", vfs.f_namelen);153 }Чтобы сохранить место, мы опустили
, которая не изменилась с представленной ранее другой программы, мы также опустилиmain(), которая теперь вызываетprocess ()вместоdo_statfs().do_statvfs()Строки 13–35 содержат список магических чисел файловых систем из справочной страницы statfs(2). Хотя эти числа можно получить из заголовочных файлов исходного кода ядра, это трудно (мы пробовали), а показанному здесь способу представления следовать легче. Строки 86–125 определяют
, которая преобразует магическое число в выводимую строку. Она осуществляет простой линейный поиск в таблице пар (значение, строка). В (маловероятном) случае, когда магическое число в таблице отсутствует,type2str()создает сообщение «неизвестный тип» и возвращает его (строки 123–124).type2str()(строки 129–153) выводит сведения изdo_statfs(). Членstruct statfsопущен, посколькуf_fsidявляется непрозрачным типом. Код прост; строка 145 используетfsid_tдля вывода типа файловой системы. Как для сходной программы, использующейtype2str(), эта функция игнорирует файловые системы, которые не расположены на локальных устройствах (строки 133–134). Вот вывод на нашей системе: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()в вашем собственном коде зависит от ваших потребностей. Как описано в предыдущем разделе, GNUstatfs()не используетdfпод GNU/Linux и в общем имеет тенденцию использовать уникальный для каждой Unix-системы системный вызов «получения сведений о файловой системе». Хотя это работает, это не очень привлекательно. С другой стороны, иногда у вас нет выбора: например, проблемы GLIBC, о которых мы упоминали выше. В этом случае нет безупречного решения.statvfs()8.4. Перемещение по иерархии файлов
Несколько системных вызовов и стандартных библиотечных функций дают возможность изменять текущий каталог и определять полный путь к текущему каталогу. Более сложные функции позволяют осуществлять произвольные действия с каждым объектом файловой системы в иерархии каталогов.
8.4.1. Смена каталога:
иchdir()fchdir()В разделе 1.2 «Модель процессов Linux/Unix» мы говорили:
Текущим каталогом является каталог, относительно которого отсчитываются относительные пути (те, которые не начинаются с
). Это каталог, «в» котором вы находитесь, когда даете оболочке команду '/'.cd <i>некоторое_место</i>У каждого процесса есть текущий рабочий каталог. Каждый новый процесс наследует свой текущий каталог от процесса, который его запустил (своего родителя). Две функции позволяют перейти в другой каталог:
#include <unistd.h>int chdir(const char *path); /* POSIX */