我有一个问题,我已经尽可能地缩小了范围。我想分/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)
您正在使用getpwent(),它在第一次调用时读取/etc/passwd文件并在内部解析它,为您提供所有条目。之后,当您这样做时setpwent(),您只是重置一个内部指针,该指针跟踪已解析的条目。getpwent()之后再次执行时setpwent(),/etc/passwd将不会再次访问该文件,因为信息已被解析。
如果你想每次都强制getpwent()重新打开和解析/etc/passwd,你应该endpwent()先调用。更换的电话setpwent()与endpwent()你会好到哪里去。
从手册页:
该
setpwent()函数倒回到密码数据库的开头。该
endpwent()函数用于在所有处理完成后关闭密码数据库。