第八章
8-1 执行下面代码,将会发现,打印出的用户ID居然是同一个,但实际上他们分别属于两个用户ID。为什么会这样?
#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
int main(void){
printf("%ld %ld\n", (long) getpwnam("man")->pw_uid, (long)getpwnam("sys")->pw_uid);
return 0;
}
根据课本所述,getpwnam()函数返回的指针是由静态分配的内存,是不可重入的,导致了两次显示的ID实际上是第二次调用getpwnam所得到的内存中的ID。但是,在我的Linux系统中,该程序正确执行,并没有返回两个ID,这说明该程序已经可以重入了。
8-2 使用setpwent()、getpwent()、和endpwent()来实现getpwnam()。
这个程序的实现比较简单,这个程序的实现中。主要使用了课本上一个通过遍历用户密码文件来显示信息的程序,只要将判断修改就成了我们的程序:
#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
#include <string.h>
struct passwd *my_getpwnam(const char * name){
struct passwd *pwd;
while((pwd = getpwent()) != NULL){
if(strcmp(pwd->pw_name, name)){
return pwd;
}
}
return NULL;
}
int main(void){
printf("%ld %ld\n", (long) my_getpwnam("man")->pw_uid, (long)my_getpwnam("sys")->pw_uid);
return 0;
}
运行后结果将显示两个整数。