getgrnam函数用法详解
getgrnam函数简介
- 头文件包含
#include <sys/types.h>
#include <grp.h>
- 函数定义
struct group *getgrnam(const char * name );
struct group *getgrgid(gid_t gid );
int getgrnam_r(const char * name , struct group * grp ,
char * buf , size_t buflen , struct group ** result );
int getgrgid_r(gid_t gid , struct group * grp ,
char * buf , size_t buflen , struct group ** result );
getgrnam函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘getgrnam’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <sys/types.h>
#include <grp.h>
getgrnam函数详细描述
getgrnam ()函数返回一个指向结构的指针,该结构包含组数据库(例如本地组文件/etc/group NIS和LDAP)中与组名name 匹配的记录的分段字段
getgrgid ()函数返回一个指向结构的指针,该结构包含组数据库中与组ID gid 匹配的记录的分段字段
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)
getgrnam_r ()和getgrgid_r ()函数获得与getgrnam ()和getgrgid ()相同的信息,但是将检索到的group结构存储在grp 所指向的空间中。group结构的成员所指向的字符串字段存储在大小为buflen 的缓冲区buf中。指向结果(在成功的情况下)或NULL(在没有找到条目或发生错误的情况下)的指针存储在*result 中
电话
sysconf(_SC_GETGR_R_SIZE_MAX)
返回-1,而不更改errno 或buf 的初始建议大小(如果该大小太小,则调用失败,使用ERANGE ,在这种情况下,调用方可以使用更大的缓冲区重试。)
getgrnam函数返回值
getgrnam ()和getgrgid ()函数返回指向group结构的指针,如果找不到匹配的条目或发生错误,则返回NULL。如果出现错误,则适当设置errno。如果想在调用后检查errno,应该在调用前将其设置为零。
返回值可能指向静态区域,并且可能被对getgrent (3)、getgrgid ()或getgrnam ()的后续调用覆盖(不要将返回的指针传递给free (3))
成功时,getgrnam_r ()和getgrgid_r ()返回零,如果没有找到匹配的组记录,则将result设置为grp ,如果出现错误,则返回0,并在result 中存储NULL,返回错误号,在*result 中存储NULL
getgrnam函数错误码
- 0 " or " ENOENT " or " ESRCH " or " EBADF " or " EPERM " or "找不到给定的name或gid。
- EINTR 捕获了一个信号;参见signal (7)
- EIO I/O错误。
- EMFILE 已达到每个进程打开的文件描述符的数量限制。
- ENFILE 已达到系统范围内打开文件总数的限制。
- ENOMEM 内存不足,无法分配group结构。
- ERANGE 提供的缓冲区空间不足。
getgrnam函数其他说明
上面“返回值”下给出的公式来自POSIX.1。它不会将“未找到”称为错误,因此不会指定errno在这种情况下可能具有的值。但这使得识别错误变得不可能。有人可能会说,根据POSIX,如果找不到条目,errno应该保持不变。在各种类UNIX系统上的实验表明,在这种情况下会出现许多不同的值:0、ENOENT、EBADF、ESRCH、EWOULDBLOCK、EPERM,可能还有其他值。
评论区