Рейтинговые книги
Читем онлайн Linux программирование в примерах - Роббинс Арнольд

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 90 91 92 93 94 95 96 97 98 ... 253

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.

1 ... 90 91 92 93 94 95 96 97 98 ... 253
На этой странице вы можете бесплатно читать книгу Linux программирование в примерах - Роббинс Арнольд бесплатно.
Похожие на Linux программирование в примерах - Роббинс Арнольд книги

Оставить комментарий