c - getpwnam getpwnam_r

标签 c linux data-structures systems-programming

我正在尝试更新函数中的密码结构。 此函数获取指向密码结构的指针,其中 我必须更新详细信息。

我得到一个函数的 struct passwd* 作为参数,我的要求是将它的成员更新为其他用户(user2)的信息,并且此函数的调用者应该具有所有这些更新的详细信息。

我试过跟随,你能帮我建议什么是理想的方法吗?

我的函数是这样的:

struct passwd* myfunc(struct passwd *pw)

对于这个pw,我必须更新细节。

Try1:

使用 getpwnam() 获取 user2 的详细信息到传递的 struct passwd *pw

pw = getpwnam("user2");
return pw;

不起作用,因为我们没有更新 pw 成员,而只是将 pw 指向其他一些结构,pw 的指针成员,仍然指向旧数据。 因此 myfunc() 的父级不会获得更新的详细信息。

我们必须写入成员。

Try2:

使用 getpwnam() 获取 user2 的详细信息到临时 struct passwd* 中。 做一个memcpy(pw, temppasswd, sizeof(struct passwd))

不起作用,因为 memcpy 是一个浅拷贝,随后的 getpwnam()(虽然没有返回给 temppasswd)将结束写入静态缓冲区,pw可能有不同的值。

Try3:

尝试了 getpwnam_r() 将详细信息写入作为参数传递给它的缓冲区,而不是写入静态数据区域(如 getpwnam)。

不能用这个,因为我没有pw,我有*pw。 所以,我无法将分配给 pw 的内存地址传递给 getpwnam_r

Try 4:

我可以在 Try2 中逐个成员复制,但如果我在将数据复制到成员之前不释放 pw 结构指针成员,可能会导致内存泄漏。

是否有任何其他方法可以将详细信息复制到传递的 pw* 而无需释放所有结构 pw* 指针成员。

这有点令人困惑,我希望我对某人有意义。

最佳答案

您可以将前两个选项组合为 *pw = *getpwnam("user2");。尽管如此,它仍然是一个浅拷贝。

至于您的问题,如果您可以将原型(prototype)更改为 struct passwd* myfunc(struct passwd **pw),那么您可以自己分配结构和所有需要的字段。然后有一个单独的函数,用户必须调用该函数来释放所有分配的数据。

关于c - getpwnam getpwnam_r,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151961/

相关文章:

c++ - 适合集合(图形)分区的数据结构

c - 在 c 中使用三元运算符的错误

c++ - 带密码学 API C/C++ 的 HMAC

c - 在 Pthread 库中杀死线程

c - fgets() 在字符串中包含新行

c - 全局变量不会在c中的其他线程中改变

python - 创建表准备好的语句错误1064

algorithm - 在 O(n)(时间和空间)中对两个数组进行排序

arrays - 插入多个元素后恢复堆属性

c# - 从外部局域网连接 MySql Raspberry Pi