Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

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) {

  • Читать дальше
  • 1
  • ...
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: