[英]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
如果不是)。 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);
}
如果是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
,可在此處訪問。
1 : http : //manpages.ubuntu.com/manpages/jaunty/en/man3/getpwnam.3.html這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.