C 如何查看多个用户组?

C 如何查看多个用户组?,c,linux,C,Linux,如何查看多个用户组 我指的是C语言的实现 我想使用该功能,但我想让它自动计算组数。这是一个现成的程序,它似乎在我的macOS 10.14.1系统上运行,似乎已经落后于时代了: #include <stdio.h> #include <unistd.h> int main(void) { int res = 0; int ng = 100; int gs[ng]; res = getgrouplist("hacksaw", 20, gs, &ng)

如何查看多个用户组

我指的是C语言的实现


我想使用该功能,但我想让它自动计算组数。

这是一个现成的程序,它似乎在我的macOS 10.14.1系统上运行,似乎已经落后于时代了:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  int res = 0;
  int ng = 100;
  int gs[ng];
  res = getgrouplist("hacksaw", 20, gs, &ng);
  printf("num_grps: %d\nres: %d\n", ng, res);
}
#包括
#包括
内部主(空)
{
int res=0;
int ng=100;
int-gs[ng];
res=getgrouplist(“hacksaw”、20、gs和ng);
printf(“数量GRP:%d\nres:%d\n”,ng,res);
}
下面是一个适用于Ubuntu 16.04的版本:

#include <stdio.h>
#include <grp.h>

int main(void)
{
  int res = 0;
  int ng = 100;
  gid_t gs[ng];
  res = getgrouplist("hacksaw", 20, gs, &ng);
  printf("num_grps: %d\nres: %d\n", ng, res);
}
#包括
#包括
内部主(空)
{
int res=0;
int ng=100;
gid_t gs[ng];
res=getgrouplist(“hacksaw”、20、gs和ng);
printf(“数量GRP:%d\nres:%d\n”,ng,res);
}

选择100码是为了提供足够的空间。

您的问题不清楚。您应该准确地说明您想要完成的任务,例如,您所说的“多个用户组”和“自动获取组数”是什么意思。请参阅。
getgrouplist()
函数获取特定用户(由UID标识)所属组的列表。内核不会(不能?)为您分配内存;你必须预先确定你愿意处理多少团体。这不是一个严重的内存使用问题。即使组ID每个为8字节(它们很可能每个为4字节),即使您分配了多达128个组(这比大多数系统可能拥有的单个用户组更多),您也在谈论1kib内存。分配它,继续生活。但是“查看多个组”是不明确的。请注意,您应该提供一个
gid\u t
数组,而不是
int
。我所指的原型是“int-getgrouplist(const-char*name,int-basegid,int*groups,int*ngroups)”;如果使用gif\t,Clang会抱怨。(我在macOS上)嗯……好吧——有趣!我现在在问题中添加了引用(),它规定了
intgetgrouplist(const char*user、gid_t group、gid_t*groups、int*ngroups)。你似乎有不同的消息来源。对于任何需要在系统之间移动代码的人来说,这都是一个可移植性问题。该函数是一个Linux和BSD扩展AFAIK。在macOS(基于BSD)上,原型是
int getgrouplist(const char*name、int basegid、int*groups、int*ngroups)![…继续…][…继续…]标准有其用途。它不在POSIX中。如果是,它将使用
gid\u t
。它可能永远不会出现在POSIX中,名称为
getgrouplist()
,因为存在不兼容的先例(出于同样的原因,您不会看到标准的
qsort\r()
)。如果它是标准化的,它将使用不同的名称。实际上,BSD的问题是,他们在添加功能方面走在了时代的前列,然后他们周围的世界发生了变化,他们的界面变得过时,但由于向后兼容的原因,无法更改。这类事情是很常见的问题。