需要实现在Linux系统上添加/删除用户和组的功能。 我使用这些POSIX调用:
这个想法是读取向量中的所有用户和组结构,修改它们,然后重写现有的/ 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
}
答案 0 :(得分:1)
这些功能有可重入的版本。例如,参见 man getgrent_r :
int getgrent_r(struct group *gbuf, char *buf,size_t buflen, struct group **gbufp);
此版本采用指向您必须提供的内存位置的指针。
然后,您可以在方便的时候释放()该结构,而不会进行不必要的复制。