比较两个 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.
我有一个问题,我已经尽可能地缩小了范围。我想计算 /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.