Linux组和用户pipe理

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

  • void setgrent(void) – 用于打开组文件
  • struct group * getgrent(void); – 阅读组结构
  • void endgrent(void) – closures文件

这个想法是读取vector中的所有用户和组结构,修改它们,然后重写现有的/ etc / passwd和/ etc / group文件。 Getgrent()函数描述告诉这些函数确实具有分配内存的静态variables,并且该指针不应该手动释放。 这意味着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 } 

这些函数有可重入版本。 请参阅man getgrent_r例如:

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

这个版本需要一个指向你必须提供的内存位置的指针。

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