Linux программирование в примерах
Часть 94 из 253 Информация о книге
читает файл, возвращая указатель наgetmntent(), которая заполнена соответствующими значениями. Это статическое хранилище переписывается при каждом вызове. Когда больше не осталось элементов, она возвращаетstatic struct mntent. (Это сходно с процедурами для чтения файлов паролей и групп; см раздел 6.3 «Имена пользователей и групп».)NULLвызывается для добавления сведений в конец открытого файла, она предназначена для использования функциейaddmntent().mountзакрывает открытый файл; вызывайте ее после завершения обработки. Не вызывайте простоendmntent(); может потребоваться очистить другие внутренние структуры данных, связанные с переменнойfclose().FILE*является более специализированной функцией. Она просматриваетhasmntopt(), переданную в качестве первого параметра, в поисках опцииstruct mntent, совпадающей со вторым аргументом. Если опция найдена, она возвращает адрес совпадающей подстроки. В противном случае возвращаетсяmount.NULLПоля в
непосредственно соответствуют полям в файлеstruct mntent. Структура выглядит следующим образом:/etc/fstabstruct mntent {char *mnt_fsname; /* Устройство или сервер для файл. С-мы. */char *mnt_dir; /* Каталог для монтирования. */char *mnt_type; /* Тип файловой системы: ufs, nfs и т.д. */char *mnt_opts; /* Отделяемые запятыми опции для fs. */int mnt_freq; /* Частота дампа (в днях). */int mnt_passno; /* Номер для 'fsck'. */};Обычным принципом работы со смонтированными файловыми системами является создание внешнего цикла, читающего
, обрабатывая по одной/etc/mtabза раз. Наш первый пример,struct mntent, делает именно это:ch08-mounted.c1 /* ch08-mounted.с --- вывод списка смонтированных файловых2 систем */3 /* ЗАМЕЧАНИЕ: специфично для GNU/Linux! */45 #include <stdio.h>6 #include <errno.h>7 #include <mntent.h> /* для getmntent() и др. */8 #include <unistd.h> /* для getopt() */910 void process(const char *filename);11 void print_mount(const struct mntent *fs);1213 char *myname;1415 /* main --- обработка опций */1617 int main(int argc, char **argv)18 {19 int c;20 char *file = "/etc/mtab"; /* файл по умолчанию для чтения */2122 myname = argv[0];23 while ((c = getopt(argc, argv, "f:")) != -1) {24 switch (c) {25 case 'f':26 file = optarg;27 break;28 default:29 fprintf(stderr, "usage: %s [-f fstab-file]\n", argv[0]);30 exit(1);31 }32 }3334 process(file);35 return 0;36 }3738 /* process --- прочесть структуры struct mntent из файла */3940 void process(const char *filename)41 {42 FILE *fp;43 struct mntent *fs;4445 fp = setmntent(filename, "r"); /* только для чтения */46 if (fp == NULL) {47 fprintf(stderr, "%s: %s: could not open: %s\n",48 myname, filename, strerror(errno));49 exit(1);50 }5152 while ((fs = getmntent(fp)) != NULL)53 print_mount(fs);5455 endmntent(fp);56 }5758 /* print_mount --- вывод одного смонтированного элемента */5960 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