Книга: Linux программирование в примерах
8.2.2. Работа со смонтированными файловыми системами: getmntent()
8.2.2. Работа со смонтированными файловыми системами: getmntent()
Любой из файлов /etc/fstab
, /etc/mtab
и /proc/mounts
может быть прочитан программное использованием набора процедур getmntent()
:
#include <stdio.h> /* GLIBC */
открывает файл, содержащий элементы точек монтирования. Аргумент
#include <mntent.h>
FILE *setmntent(const char *filename, const char *type);
struct mntent *getmntent(FILE *filep);
int addmntent(FILE *filep, const struct mntent *mnt);
int endmntent(FILE *filep);
char *hasmntopt(const struct mntent *mnt, const char *opt);
setmntent()filename
является файлом, который должен быть открыт. Аргумент type
похож на второй аргумент fopen()
, указывая доступ для чтения, записи или чтения/записи. (Рассмотрите команду mount
, которой приходится добавлять элемент к /etc/mtab
для каждой файловой системы, которую она монтирует, и umount
, которая должна удалять этот элемент.) Затем возвращаемое значение типа FILE*
используется с оставшимися процедурами.
getmntent()
читает файл, возвращая указатель на static struct mntent
, которая заполнена соответствующими значениями. Это статическое хранилище переписывается при каждом вызове. Когда больше не осталось элементов, она возвращает NULL
. (Это сходно с процедурами для чтения файлов паролей и групп; см раздел 6.3 «Имена пользователей и групп».)
addmntent()
вызывается для добавления сведений в конец открытого файла, она предназначена для использования функцией mount
.
endmntent()
закрывает открытый файл; вызывайте ее после завершения обработки. Не вызывайте просто fclose()
; может потребоваться очистить другие внутренние структуры данных, связанные с переменной FILE*
.
hasmntopt()
является более специализированной функцией. Она просматривает struct mntent
, переданную в качестве первого параметра, в поисках опции mount
, совпадающей со вторым аргументом. Если опция найдена, она возвращает адрес совпадающей подстроки. В противном случае возвращается NULL
.
Поля в struct mntent
непосредственно соответствуют полям в файле /etc/fstab
. Структура выглядит следующим образом:
struct 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.c
, делает именно это:
1 /* ch08-mounted.с --- вывод списка смонтированных файловых
2 систем */
3 /* ЗАМЕЧАНИЕ: специфично для GNU/Linux! */
4
5 #include <stdio.h>
6 #include <errno.h>
7 #include <mntent.h> /* для getmntent() и др. */
8 #include <unistd.h> /* для getopt() */
9
10 void process(const char *filename);
11 void print_mount(const struct mntent *fs);
12
13 char *myname;
14
15 /* main --- обработка опций */
16
17 int main(int argc, char **argv)
18 {
19 int c;
20 char *file = "/etc/mtab"; /* файл по умолчанию для чтения */
21
22 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 }
33
34 process(file);
35 return 0;
36 }
37
38 /* process --- прочесть структуры struct mntent из файла */
39
40 void process(const char *filename)
41 {
42 FILE *fp;
43 struct mntent *fs;
44
45 fp = setmntent(filename, "r"); /* только для чтения */
46 if (fp == NULL) {
47 fprintf(stderr, "%s: %s: could not open: %sn",
48 myname, filename, strerror(errno));
49 exit(1);
50 }
51
52 while ((fs = getmntent(fp)) != NULL)
53 print_mount(fs);
54
55 endmntent(fp);
56 }
57
58 /* print_mount --- вывод одного смонтированного элемента */
59
60 void print_mount(const struct mntent *fs)
61 {
62 printf("%s %s %s %s %d %dn",
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).
Функция print_mount()
выводит информацию из struct mnent
. Вывод во многом напоминает вывод 'cat /etc/mtab
':
$ ch08-mounted /* Запуск программы */
/dev/hda2 / ext3 rw 0 0
none /proc proc rw 0 0
usbdevfs /proc/bus/usb usbdevfs rw 0 0
/dev/hda5 /d ext3 rw 0 0
none /dev/pts devpts rw,gid=5,mode=620 0 0
none /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
/dev/hda1 /win vfat rw,noexec,nosuid,nodev,uid=2076,gid=10,user=arnold 0 0
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Лекция 15. Работа с базами данных
- Работа с ресурсами локальной сети
- Эффективная работа с временными файлами сортировки
- Ускоренная работа с индексами
- HR-брендинг: Работа с поколением Y, новые инструменты для коммуникации, развитие корпоративной культуры и еще 9 эффектив...
- Безопасная работа с внешними таблицами
- Работа со строками
- 9.2. Работа прокси-сервера
- 3. Заработок для фотографов: заработать на фото – сайты фотобанков
- Работа с активным документом
- Работа с переменными