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

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

Жанры

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

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

Эволюционер из трущоб. Том 12

Панарин Антон
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 12

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

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

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

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

На границе империй. Том 10. Часть 13

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 13

Герой

Мазин Александр Владимирович
4. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Герой

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

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

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

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Династия. Феникс

Майерс Александр
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Династия. Феникс

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Великий князь

Кулаков Алексей Иванович
2. Рюрикова кровь
Фантастика:
альтернативная история
8.47
рейтинг книги
Великий князь

Неучтенный элемент. Том 9

NikL
9. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 9