簡體   English   中英

Unix編程。 不知道如何使用passwd結構

[英]Unix programming. Not sure how to use the passwd struct

我做了一些研究,我仍然在努力研究passwd結構。

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

我需要獲取用戶ID,但我不認為我正在使用它。

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

此方法調用將返回一個指向結構的點,該結構將包含我需要的所有數據。 我對參數相當困惑。

struct passwd。 我需要先申報嗎? struct passwd passwd?

我完全迷失了如何使用它。

最后,一旦我填滿我的指針。 我會用什么電話來獲取數據? 謝謝你的幫助。

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如果不是)。 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);
    }

如果是instread,您希望按名稱查找用戶以查找其ID,請使用getpwnam_r並檢查返回的struct的pw_uid字段。

好吧,首先,我不太確定你要完成什么 - 你說你需要獲得uid,但getpwuid是用於查找基於uid的其他信息。 您是否想要getpwnam,它根據用戶名查找? 然后你需要使用uid來實現另一個功能嗎?

在任何情況下,我在下面說的所有內容都適用於getpwnam和getpwuid - 只需替換username參數的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更適合更仔細的錯誤處理和內存管理,但如果您需要做的只是快速查找,這應該沒問題。

首先,如果你想獲得UID,那么可能你手頭getpwnam_r()戶名,在這種情況下你應該使用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 ,可在此處訪問。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM