比较两个 passwd 结构

mac*_*bug 2 c linux passwd

我有一个问题,我已经尽可能地缩小了范围。我想分/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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*lli 5

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

如果你想每次都强制getpwent()重新打开和解析/etc/passwd,你应该endpwent()先调用。更换的电话setpwent()endpwent()你会好到哪里去。


手册页

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

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