【问题标题】:getpwnam getpwnam_rgetpwnam getpwnam_r
【发布时间】:2012-10-31 05:51:06
【问题描述】:

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

我将struct passwd* 作为参数传递给函数,我的要求是将其成员更新为其他用户(user2)的信息,并且该函数的调用者应该拥有所有这些更新的详细信息。

我尝试了以下操作,请您帮助我建议什么是理想的方法。

我的功能是这样的:

struct passwd* myfunc(struct passwd *pw)

对于这个pw,我要更新一下细节。

尝试1:

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

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

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

我们必须写信给会员。

尝试2:

使用getpwnam() 将用户2 的详细信息放入临时struct passwd*。 做一个memcpy(pw, temppasswd, sizeof(struct passwd))

不起作用,因为memcpy是浅拷贝,因此getpwnam()(虽然没有给temppasswd返回)会覆盖写静态缓冲区,pw可能有不同的值。

尝试3:

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

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

尝试 4:

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

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

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

【问题讨论】:

    标签: c linux data-structures systems-programming


    【解决方案1】:

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

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

    【讨论】:

    • 不,我不能更改函数原型,因为调用者很多。而且我不想更改所有这些功能:(
    • @Ram 那么不幸的是,你不得不忍受浅拷贝和静态缓冲区。
    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多