4

我已经做了一些研究,但我仍在努力解决 passwd 结构。

http://www.opengroup.org/onlinepubs/000095399/basedefs/pwd.h.html

我需要获取用户 ID,但我认为我根本不理解它。

int getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **);

此方法调用返回一个指向结构的点,该结构将包含我需要的所有数据。我对参数相当困惑。

结构密码。我需要先声明吗?结构密码密码?

我完全不知道如何使用它。

最后,一旦我填写了我的指针。我将使用哪些调用来获取数据?谢谢你的帮助。

4

3 回答 3

7

getpwuid_r签名中:

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp);

uid是一个输入参数 - 它是您要查找的用户的 UID。其余的本质上是输出参数:指向的结构pwbuf将填充密码信息,指向的指针pwbufp将设置为pwbuf调用是否成功(NULL如果不成功)的值。buf和参数对指定用户提供的缓冲区,该buflen缓冲区将用于存储struct passwd返回的结构成员所指向的字符串。

您可以像这样使用它(这会查找具有 UID 101 的用户):

    struct passwd pwent;
    struct passwd *pwentp;
    char buf[1024];

    if (getpwuid_r(101, &pwent, buf, sizeof buf, &pwentp))
    {
            perror("getpwuid_r");
    }
    else
    {
            printf("Username: %s\n", pwent.pw_name);
            printf("Real Name: %s\n", pwent.pw_gecos);
            printf("Home Directory: %s\n", pwent.pw_dir);
    }

如果您想按名称查找用户以查找他们的 ID,请使用getpwnam_r并检查pw_uid返回结构的字段。

于 2009-10-22T22:18:53.150 回答
2

首先,如果您想获取 UID,那么您可能手头有用户名,在这种情况下您应该使用该用户名getpwnam_r()。此函数的使用与 完全一样getpwuid_r(),只是您将名称 (char *)作为第一个参数传递给它。

其次,您不需要声明“struct passwd”。它是在您包含 pwd.h 时声明的。

第三,函数的确切签名是:

int getpwnam_r(const char *name, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);

在上面,pwd 是一个输出参数。这就是函数返回您的密码条目(如果找到)的地方。

getpwnam_r最后,在 Linuxgetpwnam_r手册页中有一个如何使用的完整示例,可在此处访问。

1: http: //manpages.ubuntu.com/manpages/jaunty/en/man3/getpwnam.3.html这里

于 2009-10-22T22:25:33.177 回答
1

好的,首先,我不太确定您要完成什么 - 您说您需要获取 uid,但 getpwuid 是用于根据 uid 查找其他信息。您是否想要根据用户名查找的 getpwnam?然后你需要将uid用于另一个功能吗?

无论如何,我在下面所说的一切都适用于 getpwnam 和 getpwuid - 只需将 uid 参数换成 username 参数即可。

你把你的文档弄混了一点。来自手册页的几乎引用:

struct passwd *getpwuid(uid_t uid);

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp);

getpwuid() 函数返回一个指向结构的指针,该结构包含密码数据库中与用户 ID uid 匹配的记录的断开字段。

getpwuid_r() 函数获取相同的信息,但将检索到的 passwd 结构存储在 pwbuf 指向的空间中。

听起来你一般对指针有点模糊。但是,您不必为这项工作担心太多,对于您的目的来说,更简单的版本可能会很好:

struct passwd * my_passwd;
my_passwd = getpwuid(uid);
// or:
// my_passwd = getpwnam(username);

if (my_passwd == NULL) {
    // the lookup failed - handle the error!
} else {
    // the lookup succeeded - do your thing 
    printf("User name: %s\n", my_passwd->pw_name);
    printf("User password: %s\n", my_passwd->pw_passwd);
    ...
}

请注意,在这种情况下,您不需要为指针分配内存,因为 getpwuid 返回一个指向已分配内存和存储信息的结构的指针。

结构的完整定义(其他成员的名称)在手册页中。

第二种形式 getpwuid_r 更适合更仔细的错误处理和内存管理,但如果您需要做的只是快速查找,这应该没问题。

于 2009-10-22T22:19:09.413 回答