侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

getgrent_r函数用法详解

noerror
2022-11-09 / 0 评论 / 0 点赞 / 13 阅读 / 621 字 / 正在检测是否收录...

getgrent_r函数用法详解

getgrent_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 );

getgrent_r函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘getgrent_r’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <grp.h>

getgrent_r函数详细描述

函数getgrent_r ()和fgetgrent_r ()是getgrent (3)和fgetgrent (3)的可重入版本,前者从由setgrent (3)初始化的流中读取下一个组条目,后者从stream 中读取下一个组条目
中的group结构定义如下:

struct group {
   char   *gr_name;        /* group name */
   char   *gr_passwd;      /* group password */
   gid_t   gr_gid;         /* group ID */
   char  **gr_mem;         /* NULL-terminated array of pointers
                              to names of group members */
};

有关此结构的字段的更多信息,请参见group (5)
不可重入函数返回一个指向静态存储的指针,其中这个静态存储包含指向组名、密码和成员的更多指针。这里描述的可重入函数在调用者提供的缓冲区中返回所有这些。首先是可以容纳struct group的缓冲区gbuf。接下来是大小为buflen的缓冲区buf,它可以容纳额外的字符串。这些函数的结果,即从流中读取的PPPP5,被存储在所提供的缓冲器gbuf 中,并且指向该PPPP5的指针被返回到gbufp 中

getgrent_r函数返回值

如果成功,这些函数返回0,*gbufp是指向struct group的指针。出错时,这些函数返回一个错误值,*gbufp为空。

getgrent_r函数错误码

  • ENOENT 没有更多条目。
  • ERANGE 提供的缓冲区空间不足。请使用较大的缓冲区重试。

getgrent_r函数其他说明

函数getgrent_r ()不是真正可重入的,因为它与所有其他线程共享流中的读取位置。

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("\en");
   }
   endgrent();
   exit(EXIT_SUCCESS);
}
0

评论区