Linux программирование в примерах - Роббинс Арнольд Страница 78

Тут можно читать бесплатно Linux программирование в примерах - Роббинс Арнольд. Жанр: Компьютеры и Интернет / Интернет. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте FullBooks.club (Фулбукс) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Linux программирование в примерах - Роббинс Арнольд

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту pbn.book@yandex.ru для удаления материала


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

Прочтите описание перед тем, как прочитать онлайн книгу «Linux программирование в примерах - Роббинс Арнольд» бесплатно полную версию:

В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.

 

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

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

ID группы

Как и для ID пользователя, должен быть уникальным для каждой группы.

Список пользователей

Разделенный запятыми список пользователей, являющихся членами группы.

В предыдущем примере мы видели, что пользователь arnold является членом нескольких групп. Это членство на практике отражается в том, что называют набором групп (group set). Помимо главных номеров ID пользователя и ID группы, которые есть у процессов, набор групп является набором номеров ID дополнительных групп, который имеет при себе каждый процесс. Система проверяет на соответствие с этими ID групп, ID группы файла при осуществлении проверки прав доступа. Эта тема более подробно обсуждается в разделе 11 «Разрешения и ID пользователя и группы».

API базы данных групп сходна с API для базы данных пользователей. Следующие функции определены в <grp.h>:

#include <sys/types.h> /* XSI */

#include <grp.h>

struct group *getgrent(void);

void setgrent(void);

void endgrent(void);

struct group *getgrnam(const char *name);

struct group *getgrgid(gid_t gid);

struct group соответствует записям в /etc/group:

struct group {

 char *gr_name;   /* имя группы */

 char *gr_passwd; /* пароль группы */

 gid_t gr_gid;    /* id группы */

 char **gr_mem;   /* члены группы */

};

Поле gr_mem требует некоторого объяснения. Хотя оно объявлено в виде указателя на указатель (char**), лучше представить его как массив строк (наподобие argv). Последний элемент в массиве устанавливается в NULL. Когда в списке нет членов, первый элемент массива равен NULL.

ch06-groupinfo.с демонстрирует, как использовать struct group и поле gr_mem. Программа принимает в командной строке имя единственного пользователя и печатает все записи групп, в которых появляется этот пользователь:

1  /* ch06-groupinfo.с --- Демонстрация getgrent() и struct group */

2

3  #include <stdio.h>

4  #include <sys/types.h>

5  #include <grp.h>

6

7  extern void print_group(const struct group *gr);

8

9  /* main --- вывести строки групп для пользователя в argv[1] */

10

11 int

12 main(int argc, char **argv)

13 {

14  struct group *gr;

15  int i;

16

17  if (argc != 2) { /* Проверка аргументов */

18   fprintf(stderr, "usage: %s user\n", argv[0]);

19   exit(1);

20  }

21

22  while ((gr = getgrent()) != NULL) /* Получить запись каждой группы: */

23   for (i = 0; gr->gr_mem[i] != NULL; i++) /* Рассмотреть каждый член */

24    if (strcmp(gr->gr_mem[i], argv[i]) == 0) /* Если пользователь найден... */

25     print_group(gr); /* Вывести запись */

26

27  endgrent();

28

29  exit(0);

30 }

Функция main() сначала проверяет ошибки (строки 17–20). Основным компонентом программы является вложенный цикл. Внешний цикл (строка 22) перечисляет все записи базы данных группы. Внутренний цикл (строка 23) перечисляет всех членов массива gr_mem. Если один из членов соответствует имени из командной строки (строка 24), для печати записи вызывается print_group() (строка 25):

32 /* print_group --- печать записи группы */

33

34 void

35 print_group(const struct group *gr)

36 {

37  int i;

38

39  printf("%s:%s:%ld:gr->gr_name, gr->gr_passwd, (long)gr->gr_gid);

40

41  for (i = 0; gr->gr_mem[i] != NULL; i++) {

42   printf("%s", gr->gr_mem[i]);

43   if (gr->gr_mem[i+1) != NULL)

44    putchar(',');

45  }

46

47  putchar('\n');

48 }

Функция print_group() (строки 34–48) проста, ее логика подобна логике main() для печати списка членов. Члены списка группы разделены запятыми; поэтому тело цикла до вывода запятой должно проверить, что следующий элемент в массиве не является NULL. Этот код работает правильно, даже если в группе нет членов. Однако мы знаем, что для этой программы есть члены, иначе print_group() не была бы вызвана! Вот что происходит при запуске программы:

$ <b>ch06-groupinfo arnold</b>

mail:x:12:mail,postfix,arnold

uucp:x:14:uucp,arnold

floppy:x:19:arnold

devel:x:42:miriam,arnold

arnold:x:2076:arnold

6.4. Терминалы: isatty()

Модель стандартного ввода, стандартного вывода и стандартной ошибки Linux/Unix препятствует специальной трактовке устройств ввода и вывода. Программам обычно не нужно знать или беспокоиться о том, направляется ли их вывод на терминал, в файл, канал, физическое устройство или что-то еще.

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.