Linux组和用户管理

时间:2014-02-03 18:24:12

标签: c++ c linux

需要实现在Linux系统上添加/删除用户和组的功能。 我使用这些POSIX调用:

  • void setgrent(void) - 用于打开组文件
  • struct group * getgrent(void); - 阅读小组结构
  • void endgrent(void) - 用于关闭文件

这个想法是读取向量中的所有用户和组结构,修改它们,然后重写现有的/ etc / passwd和/ etc / group文件。 Getgrent()函数描述告诉我们这些函数确实具有带有已分配内存的静态变量,并且不应手动释放该指针。这意味着endgrent()应该释放堆上的所有指针。这引发了一个问题,因为结构组在堆上保存了大量数据。因此,如果我决定将它存储在某个地方,我需要为gr_mem中的每个成员以及其他成员执行strdup(),因此我不会丢失任何数据。

有没有办法更有效地存储群组结构?也许有另一种方法来解决这个问题?

struct group
{
   char *gr_name; // The name of the group. 
   gid_t gr_gid; // The group ID of the group. 
   char **gr_mem; // array of group members
}

1 个答案:

答案 0 :(得分:1)

这些功能有可重入的版本。例如,参见 man getgrent_r

int getgrent_r(struct group *gbuf, char *buf,size_t buflen, struct group **gbufp);

此版本采用指向您必须提供的内存位置的指针。

然后,您可以在方便的时候释放()该结构,而不会进行不必要的复制。