【问题标题】:Compare two passwd structures比较两个 passwd 结构
【发布时间】:2020-02-04 23:56:54
【问题描述】:

我有一个问题,我已经尽可能地缩小了范围。我想计算/etc/passwd 中的行数两次。一次作为参考,一次检测任何变化。

我初始化了一个passwd 结构并计算其中的条目数。然后我打电话给setpwent()。完成后,我初始化了第二个 passwd 结构,请注意我添加了一个 sleep 调用,因此有足够的时间添加另一个用户。问题是新结构与第一个结构相同,即使我添加了一个新用户并在添加后初始化了一个新结构。所以没有区别。

#include <stdio.h>
#include <pwd.h>
#include <unistd.h>
int main()
{
    for(;;)
    {
        struct passwd *i;
        int y = 0;
        while((i = getpwent()) != NULL)
            y++;
        printf("Lines : %d\n", y);
        setpwent();
        sleep(30);
        struct passwd *j;
        int x = 0;
        while((j = getpwent()) != NULL)
            x++;
        printf("Lines : %d\n", x);
        setpwent();
    }
}

【问题讨论】:

  • 你不要初始化另一个结构,你只是使用另一个指针变量,这没有什么区别。你甚至不能初始化任何类型的结构,因为没有结构传递给getpwent()。手册页不是很清楚,但我会尝试在第二个计数循环之前调用 endpwent() 而不仅仅是 setpwent()。

标签: c linux passwd


【解决方案1】:

您正在使用getpwent(),它在第一次调用时会读取/etc/passwd 文件并在内部对其进行解析,从而为您提供所有条目。之后,当您执行setpwent() 时,您只是重置了一个跟踪已解析 条目的内部指针。当您在setpwent() 之后再次执行getpwent() 时,将不会再次访问/etc/passwd 文件,因为该信息已经被解析。

如果你想强制getpwent()每次都重新打开并解析/etc/passwd,你应该先调用endpwent()。将setpwent() 的调用替换为endpwent(),就可以了。


来自the manual page:

setpwent() 函数回退到密码数据库的开头。

endpwent()函数用于在所有处理完成后关闭密码数据库。

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多