getpwnam getpwnam_r

时间:2012-10-31 05:51:06

标签: 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

  

尝试4:

我可以在Try2中通过成员副本执行成员,但如果在将数据复制到其中之前没有释放pw结构指针成员,则可能导致内存泄漏。

在没有释放所有struct pw*指针成员的情况下,是否有任何其他方法可以将详细信息复制到pw*

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

1 个答案:

答案 0 :(得分:0)

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

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