【问题标题】:Unix programming. Not sure how to use the passwd structUnix 编程。不确定如何使用 passwd 结构
【发布时间】:2009-10-22 21:55:16
【问题描述】:

我已经做了一些研究,但我仍在为 passwd 结构而苦苦挣扎。

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

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

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

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

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

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

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

【问题讨论】:

    标签: c unix passwd


    【解决方案1】:

    getpwuid_r签名中:

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

    uid 是一个输入参数 - 它是您要查找的用户的 UID。其余的本质上都是输出参数:pwbuf指向的结构体会填充密码信息,如果调用成功,pwbufp指向的指针会被设置为pwbuf的值(而@ 987654327@ 如果不是)。 bufbuflen 参数对指定用户提供的缓冲区,该缓冲区将用于存储返回的 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 字段。

    【讨论】:

    • 很好,我使用了 getpwuid,而你使用了 getpwuid_r。希望 OP 寻找的答案就是其中之一!
    【解决方案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 是一个输出参数。这就是函数返回您的密码条目(如果找到)的地方。

    最后,在 Linux getpwnam_r 手册页中有一个完整的示例说明如何使用 getpwnam_r,可访问 here

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

    【讨论】:

    • 不,pwd 不是输出参数,而是指向存储结果数据的内存的指针。 result 是一个输出参数,将指向pwd(找到条目时)或0(找不到条目时)。 pwdbuf 只是为函数提供内存来存储数据,避免函数 getpwnam_r 必须自己分配内存。
    【解决方案3】:

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

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

    您的文档有点混乱。来自手册页的几乎引用:

    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 更适合更仔细的错误处理和内存管理,但如果您需要做的只是快速查找,这应该没问题。

    【讨论】:

    • 感谢大家提供的所有帮助。我现在应该没事了。有人以不同的方式向我解释它,我最初是在正确的道路上开始的。如果您想知道我有一个 unix 编程项目,需要显示其目录中所有文件的所有用户权限。
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多