如何在C中使用getgrnam()和getgrent()

时间:2016-11-07 11:04:06

标签: c system

让我们先查看我的代码。

#include <stdio.h>
#include <grp.h>
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main(int argc, char** argv){
    struct group *grp;
    struct group *tmpGrp;
    struct passwd *pw;

    int n;
    gid_t gid;

    pw=getpwnam(argv[1]);
    gid=pw->pw_gid;

    printf(“%s”,pw->pw_name);
    printf(“\n”);
    grp = getgrgid(gid);
    char *mainGrp = grp->grame;
    printf(“out : %s\t”, mainGrp);

    while((tmpGrp=getgrgent())!=NULL){
        n=0;
        printf(“in : %s\t”,mainGrp);
    }
    printf(“\n”);
    return 0;
}

它的输出如下:

root
out : root    in : root    in : other    in : bin    in : sys   ....

如您所见,当同时使用getgrnam()和getgrent()时,组名称会更改,即使是以字符串分配。

我想要像

这样的结果
root
out : root    in : root    in : root    in : root  ....

代码例程getgrgent()就在分配到字符串之后,但为什么会这样呢?以及如何解决它?

测试操作系统:Solaris 10

测试编译器:GCC

1 个答案:

答案 0 :(得分:2)

来自this (Linux) manual page for getgrent

  

返回值可能指向静态区域,可能会被后续调用getgrent()getgrgid(3)getgrnam(3)覆盖。

即使您使用相同的指针,也会得到不同的名称,因为这些函数返回的数据是单个静态和共享缓冲区。

the POSIX getgrent reference specification也暗示了这一点。

如果您希望mainGrp不更改,则需要复制实际内容。例如。将mainGrp设为数组并使用strcpy