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

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

Жанры

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

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

Здравствуй, Мир!

Француз Михаил
Фантастика:
рпг
попаданцы
6.25
рейтинг книги
Здравствуй, Мир!

Законы Рода. Том 8

Мельник Андрей
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

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

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

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

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

Наномашины, внучок! Том 2

Новиков Николай Васильевич
2. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, внучок! Том 2

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Кодекс Охотника. Книга XXXVI

Винокуров Юрий
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Белый Волк

Мазин Александр Владимирович
2. Викинг
Приключения:
исторические приключения
9.12
рейтинг книги
Белый Волк

Газлайтер. Том 39

Володин Григорий Григорьевич
39. История Телепата
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 39

Цивилизация статуса (сборник)

Шекли Роберт
Сборники Роберта Шекли
Фантастика:
фэнтези
8.22
рейтинг книги
Цивилизация статуса (сборник)

Двойник короля 15

Скабер Артемий
15. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 15