gpt4 book ai didi

c++ - Linux组和用户管理

转载 作者:太空狗 更新时间:2023-10-29 12:32:55 24 4
gpt4 key购买 nike

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

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

想法是读取 vector 中的所有用户和组结构,修改它们,然后重写现有的/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
}

最佳答案

这些函数有可重入版本。参见 ma​​n getgrent_r 示例:

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

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

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

关于c++ - Linux组和用户管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com