Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

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-системах есть схожие процедуры, но их идентичность не гарантируется.

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

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Третий. Том 5

INDIGO
5. Отпуск
Фантастика:
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Третий. Том 5

Натиск

Осадчук Алексей Витальевич
12. Последняя жизнь
Фантастика:
аниме
фэнтези
попаданцы
6.20
рейтинг книги
Натиск

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Старый, но крепкий 2

Крынов Макс
2. Культивация без насилия
Фантастика:
рпг
уся
эпическая фантастика
5.00
рейтинг книги
Старый, но крепкий 2

Встреча

Видум Инди
7. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Встреча

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

На границе империй. Том 5

INDIGO
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
На границе империй. Том 5

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5