第八章

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;
}

运行后结果将显示两个整数。

results matching ""

    No results matching ""