Scroll to navigation

GETGRENT_R(3) Руководство программиста Linux GETGRENT_R(3)

ИМЯ

getgrent_r, fgetgrent_r - возвращает запись из файла групп (реентерабельные версии)

СИНТАКСИС

#include <grp.h>
int getgrent_r(struct group *gbuf, char *buf,
               size_t buflen, struct group **gbufp);
int fgetgrent_r(FILE *stream, struct group *gbuf, char *buf,
                size_t buflen, struct group **gbufp);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

getgrent_r(): _GNU_SOURCE
fgetgrent_r():
начиная с glibc 2.19:
_DEFAULT_SOURCE
в glibc 2.19 и старее:
_SVID_SOURCE

ОПИСАНИЕ

Функции getgrent_r() и fgetgrent_r() являются реентерабельными версиями getgrent(3) и fgetgrent(3). Первая читает следующую запись группы из потока, инициализированного setgrent(3). Последняя читает следующую запись группы из stream.

Структура group определена в <grp.h> следующим образом:


struct group {

char *gr_name; /* имя группы */
char *gr_passwd; /* пароль группы */
gid_t gr_gid; /* ID группы */
char **gr_mem; /* массив, указателей
имён членов группы, оканчивающийся NULL */ };

Подробней о полях этой структуры смотрите в group(5).

Нереентерабельные версии возвращают указатель на статическое хранилище, в котором хранятся другие указатели на имя группы, пароль и список членов. Реентерабельные функции, описанные здесь, возвращают всю информацию в буферах, предоставленных вызывающим. Основным буфером является gbuf, в котором может храниться struct group. В дополнительном буфере buf размера buflen могут храниться дополнительные строки. Результат этих функций, прочитанная из потока struct group, сохраняется в предоставляемый буфер *gbuf, и указатель на эту struct group возвращается в *gbufp.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении эти функции возвращают 0 и *gbufp указывает на struct group. При ошибке возвращается значение ошибки и *gbufp равен NULL.

ОШИБКИ

Больше записей нет.
Недостаточно места в буфере. Попробуйте ещё раз с большим буфером.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
getgrent_r() Безвредность в нитях MT-Unsafe race:grent locale
fgetgrent_r() Безвредность в нитях MT-Safe

In the above table, grent in race:grent signifies that if any of the functions setgrent(3), getgrent(3), endgrent(3), or getgrent_r() are used in parallel in different threads of a program, then data races could occur.

СООТВЕТСТВИЕ СТАНДАРТАМ

Эти функции являются расширениями GNU; они выполнены похожими на POSIX-версию функции getpwnam_r(3). В других системах используется прототип


struct group *getgrent_r(struct group *grp, char *buf,

int buflen);

или, лучше,


int getgrent_r(struct group *grp, char *buf, int buflen,

FILE **gr_fp);

ЗАМЕЧАНИЯ

Функция getgrent_r() не совсем реентерабельна, так как она использует общую позицию чтения в потоке с другими нитями.

ПРИМЕРЫ

#define _GNU_SOURCE
#include <grp.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define BUFLEN 4096
int
main(void)
{

struct group grp;
struct group *grpp;
char buf[BUFLEN];
int i;
setgrent();
while (1) {
i = getgrent_r(&grp, buf, sizeof(buf), &grpp);
if (i)
break;
printf("%s (%jd):", grpp->gr_name, (intmax_t) grpp->gr_gid);
for (int j = 0; ; j++) {
if (grpp->gr_mem[j] == NULL)
break;
printf(" %s", grpp->gr_mem[j]);
}
printf("\n");
}
endgrent();
exit(EXIT_SUCCESS); }

СМ. ТАКЖЕ

fgetgrent(3), getgrent(3), getgrgid(3), getgrnam(3), putgrent(3), group(5)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

1 ноября 2020 г. GNU