まず、あなたが達成しようとしていることはあまりよく分かりません。あなたはuidを取得する必要があると言っていますが、getpwuidはuidに基づいて他の情報を調べるためのものです。あなたはおそらくユーザー名に基づいてルックアップするgetpwnamをしたいですか?そして、別の関数にuidを使う必要がありますか?
いずれにしても、私が以下で言うことは、getpwnamとgetpwuidの両方に適用されます。username引数のuid引数を入れ替えてください。
あなたは少しドキュメントを混在させました。 manページからほとんど引用符:
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はメモリが割り当てられ情報が格納された構造体へのポインタを返すからです。
構造(他のメンバーの名前)の完全な定義は、manページです。
二番目の形式、getpwuid_rは、より慎重なエラー処理とメモリ管理のためのより良いですが、あなたがする必要があるすべては高速検索であれば、これは問題ないはずです。あなたはUIDを取得したい場合
ニース、私はgetpwuidを使用して、あなたはgetpwuid_rを使用しました。うまくいけばOPの探している答えは、これらの一つです! – Cascabel