Литмир - Электронная Библиотека
A
A

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: %s\n",

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 %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
.

94
{"b":"576259","o":1}