2009-10-22 7 views
5

私はいくつかの研究を行いましたが、私はまだpasswd構造体で苦労しています。UNIXプログラミング。 passwd構造体の使い方が分かりません

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

しかし私は、私は全くそれを理解し使用していると思ういけないユーザーIDを取得する必要があります。

int getpwuid_r(uid_t、構造体passwd *、char *、size_t、構造体passwd **);

このメソッド呼び出しは、必要なすべてのデータを含む構造体にポイントを返します。私はかなりパラメータを混乱させる。

struct passwd。私はこれを最初に宣言する必要がありますか? struct passwd passwd?

私はこれをどのように使うのか全く分かりません。

最後に、一度ポインタを入力してください。データを取得するために使用するコールは何ですか?助けてくれてありがとう。 getpwuid_r署名で

答えて

6

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); 
    } 

あなたは、自分のIDを見つけるgetpwnam_rを使用してpw_uidを調べるために、名前でユーザーを検索したいinstread場合返された構造体のフィールド。

+0

ニース、私はgetpwuidを使用して、あなたはgetpwuid_rを使用しました。うまくいけばOPの探している答えは、これらの一つです! – Cascabel

1

まず、あなたが達成しようとしていることはあまりよく分かりません。あなたは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を取得したい場合

+0

私は誰もが提供してくれたすべてのことに感謝します。私は今大丈夫になるはずです。誰かが私に違った説明をしてくれました。私はもともと正しい道を歩いていました。 私は自分のディレクトリ内のすべてのファイルに対するすべてのユーザー権限を表示する必要がある、UNIXプログラミングプロジェクトを持っているのだろうかと疑問に思いました。 –

2

はまず、その後、おそらくあなたが代わりにgetpwnam_r()を使用する必要があり、その場合には、手元にユーザ名を持っています。この機能は、あなたが最初のパラメータとして名前(char *)それを渡すことを除いて、正確にgetpwuid_r()のように使用される。

第二に、あなたは `構造体passwdの」を宣言する必要はありません。あなたが

pwd.h.含まれている場合、それが宣言されています

機能の正確な署名である第三に、上記で

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

、PWDは出力パラメータであることが発見された場合、この関数は、パスワードの入力を返すところがある

最後に、Linuxのmanページgetpwnam_r、アクセスheregetpwnam_rを使用する方法の完全な例があります。

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

関連する問題