比较两个 passwd 结构

Compare two passwd structures

我有一个问题,我已经尽可能地缩小了范围。我想计算 /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(),它在第一次调用时读取 /etc/passwd 文件并在内部解析它,为您提供所有条目。之后,当您执行 setpwent() 时,您只是重置了一个内部指针,该指针跟踪 已解析的 条目。 setpwent()后再次执行getpwent()时,不会再次访问/etc/passwd文件,因为信息已经被解析。

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


来自 the manual page:

The setpwent() function rewinds to the beginning of the password database.

The endpwent() function is used to close the password database after all processing has been performed.