GETGRENT_R

Section: Linux Programmer's Manual (3)
Updated: 2020-11-01
Index JM Home Page
 

名前

getgrent_r, fgetgrent_r - グループファイルエントリーをリエントラント (reentrant) に取り出す  

書式

#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;         /* グループのメンバ名へのポインター
                               の配列 (配列はヌルで終端する) */ };

この構造体のフィールドの詳細は group(5) を参照のこと。

リエントラントでない関数は静的な格納領域へのポインターを返す。 この静的な格納領域には、更にグループ名・パスワード・ メンバへのポインターが含まれる。 ここで説明されているリエントラントな関数は、 呼び出し側から提供されるバッファーにグループ名など全てを返す。 最初の引数として struct group を保持できるバッファー gbuf がある。 次にその他の文字列を保持できるサイズ buflen のバッファー buf がある。 これらの関数の結果 (ストリームから読み込まれた struct group) は、 提供されたバッファー *gbuf に格納され、この struct group へのポインターは *gbufp に返される。  

返り値

成功した場合、これらの関数は 0 を返し、 *gbufp は struct group へのポインターとなる。 エラーの場合、これらの関数はエラー値を返し、 *gbufp は NULL になる。  

エラー

ENOENT
次のエントリーがない。
ERANGE
十分なバッファー空間が与えられていない。 もっと大きなバッファーで再度実行すること。
 

属性

この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース 属性 値
getgrent_r() Thread safety MT-Unsafe race:grent locale
fgetgrent_r() Thread safety 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)  

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

group   struct   グループ   バッファー   grpp   getgrent   ポインター   エントリー   ストリーム   格納   printf   fgetgrent   size   構造体   パスワード   メンバ   領域   提供   保持   Thread   safety   grent   buflen   define   break

Linux マニュアル 一覧

関連するコマンド・関数

getgrent_r.3   getgrgid.3   getgrgid_r.3   getgrnam.3   getgrnam_r.3   putgrent.3
 

Index

名前
書式
説明
返り値
エラー
属性
準拠
注意
例
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:39:07 GMT, October 11, 2026