Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
ID группы
Как и для ID пользователя, должен быть уникальным для каждой группы.
Список пользователей
Разделенный запятыми список пользователей, являющихся членами группы.
В предыдущем примере мы видели, что пользователь
arnoldAPI базы данных групп сходна с 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_memchar**argvNULLNULLch06-groupinfo.сstruct groupgr_mem1 /* ch06-groupinfo.с --- Демонстрация getgrent() и struct group */23 #include <stdio.h>4 #include <sys/types.h>5 #include <grp.h>67 extern void print_group(const struct group *gr);89 /* main --- вывести строки групп для пользователя в argv[1] */1011 int12 main(int argc, char **argv)13 {14 struct group *gr;15 int i;1617 if (argc != 2) { /* Проверка аргументов */18 fprintf(stderr, "usage: %s usern", argv[0]);19 exit(1);20 }2122 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); /* Вывести запись */2627 endgrent();2829 exit(0);30 }Функция
main()gr_memprint_group()32 /* print_group --- печать записи группы */3334 void35 print_group(const struct group *gr)36 {37 int i;3839 printf("%s:%s:%ld:gr->gr_name, gr->gr_passwd, (long)gr->gr_gid);4041 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 }4647 putchar('n');48 }Функция
print_group()main()NULLprint_group()$ <b>ch06-groupinfo arnold</b>mail:x:12:mail,postfix,arnolduucp:x:14:uucp,arnoldfloppy:x:19:arnolddevel:x:42:miriam,arnoldarnold:x:2076:arnold6.4. Терминалы:
isatty()Модель стандартного ввода, стандартного вывода и стандартной ошибки Linux/Unix препятствует специальной трактовке устройств ввода и вывода. Программам обычно не нужно знать или беспокоиться о том, направляется ли их вывод на терминал, в файл, канал, физическое устройство или что-то еще.