LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1110|回复: 2

请教关于getpwent()的问题

[复制链接]
发表于 2007-1-14 14:13:43 | 显示全部楼层 |阅读模式
#include <pwd.h>
#include <sys/types.h>
main()
{
     struct  passwd  *user;
     while((user=getpwent())!=0)
     {
           printf("%s: %d: %d: %s: %s: %s\n", user->pw_name, user->pw_uid, user->pw_gid, user->pw_gecos, user->pw_dir, user->pw_shell);
     }
    endpwent();
}
这个getpwent在pwd.h里定义的 但是具体连接到什么库上啊 好像不光是libcrypt啊
还有像getpwent这样的在/usr/include里头文件定义的函数,函数体在哪里能看见源代码
是不是只能找安装时的发行包啊,
上面的程序在LFS6.2里编译
gcc -o pwd pwd.c -lcrypt
好像不能通过啊 要怎么编译多谢了
发表于 2007-1-15 03:10:50 | 显示全部楼层
要是編譯不了的話是你LFS的問題,getpwent等都是在glibc裏,不需要另外的庫
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-15 19:06:19 | 显示全部楼层
好像是libnss_file的问题
下面文章里提到
libnss_*版本和工作机制的问题

by QuickMouse (quickmouse@263.net) 2005年11月4日

    真正认真考虑libnss_*的版本问题还是在前两天,我刚刚用i486的方式成功编译完glibc-2.3.5。因为是想在最小系统上试验一下这个版本的glibc,所以就要考虑要把原来的最小系统中多少.so库替换成新的版本。显然对于libnss_*的文件也纳入了考虑的范围。
    以前制作最小系统,按说法都是保留/lib/libnss_SERVICE.so.X的,其中X包含1和2两个版本,分别对应glibc 2.0和glibc 2.1的NSS服务库。但是新编译出来的glibc只有libnss_SERVICE.so.2,也就是只有对应glibc 2.1的NSS库。那到底是在小系统当中替换so.2还是同时把libnss_SERVICE.so.1也删除?这就引出来一个问题:到底 libnss_*的版本和工作机制是怎样的。
    从man nsswitch.conf和info libc上都很难得到一个直接的结论,其上只是说通常而言.so.1是留给以前的glibc 2.0程序用的,而.so.2是新的glibc 2.1以后的接口。那按道理来说现在的程序都不会用glibc 2.0了,是否可以在系统当中不再保留libnss_SERVICE.so.1?
    在glibc的FAQ当中却又明确提出:
    Another problem is that older binaries that were linked statically against glibc 2.0 will reference the older nss modules (libnss_files.so.1 instead of libnss_files.so.2), so don't remove them.
    也就是要保留。这就涉及到libnss_*的工作机制问题。
    打开glibc源代码的nss/nsswitch.c文件可以看到如下的字段:
__stpcpy (__stpcpy (__stpcpy (__stpcpy (shlib_name,
                                        "libnss_"),
                                        ni->library->name),
                              ".so"),
           __nss_shlib_revision);

ni->library->lib_handle = __libc_dlopen (shlib_name);
    可见libc当中使用了dlopen去动态的加载一个libnss_*的库,显然当一个程序是动态链接到libc.so的时候,其加载的是与 libc.so版本对应的libnss_*库。这样就容易理解为什么glibc的FAQ当中所提到的:如果一个较早的程序静态链接了glibc 2.0的库,也就是在编译过程当中用-static 直接将glibc 2.0的libc.a链接入程序,则会导致其程序当中dlopen那一段代码用的是glibc 2.0的接口,也就是会打开libnss_SERVICE.so.1。
    所以,在一个系统当中,如果不存在有程序静态链接了旧版本的glibc 2.0库,则可以不必保留libnss_SERVICE.so.1。
看来glibc有时还要连接到这个上,可能和nis有关 呵呵再研究研究
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表