我有一个问题,我已尽我所能缩小了范围。我想/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()
,您仅需重置内部指针即可跟踪已解析的条目。当您在getpwent()
之后再次执行操作时setpwent()
,/etc/passwd
将不再访问该文件,因为该信息已被解析。
如果您想每次都强制getpwent()
重新打开并进行解析/etc/passwd
,则应endpwent()
先调用。更换的电话setpwent()
与endpwent()
你会好到哪里去。
从手册页:
该
setpwent()
函数后退到密码数据库的开头。在
endpwent()
完成所有处理后,该功能用于关闭密码数据库。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句