ユーザ情報
ユーザ情報というと,アカウント名,uid,gidなどである.これらの情報が実際のプログラミングでどう使用されるのかは,ちょっとわからないが,取得できないよりはできるほうがいい.
uidやログイン名を取得するための関数は,getuid(),getlogin()である.これらで取得できる値は,そのプログラムを起動したユーザのuidやログイン名である.
また,指定したユーザのログイン名,uid,gid,ホームディレクトリ,デフォルトのシェルなどを格納した構造体passwdがある.以下,私のシステムの/usr/include/pwd.h.
また,指定したユーザのログイン名,uid,gid,ホームディレクトリ,デフォルトのシェルなどを格納した構造体passwdがある.以下,私のシステムの/usr/include/pwd.h.
struct passwd
{
char *pw_name; /* Username. */
char *pw_passwd; /* Password. */
__uid_t pw_uid; /* User ID. */
__gid_t pw_gid; /* Group ID. */
char *pw_gecos; /* Real name. */
char *pw_dir; /* Home directory. */
char *pw_shell; /* Shell program. */
};
pw_gecosは標準仕様がないらしい.ので,メンバ名がこれとは異なるシステムがある,らしい.passwd構造体はユーザidから取得するgetpwuid(uid_t uid)とログイン名から取得するgetpwnam(const char *name)がある.
/etc/passwdにはユーザ情報が書いてある.これをオープンして,読み込むこともできる(ハズ,試してない)が,もっと効率的にプログラミングするために上記のpasswd構造体やgetpwuidやgetpwnamがある.そして,/etc/passwdを走査するための関数としてsetpwent,getpwent,endpwentがある.setしてgetしてendする.
上に出て来た関数を使用するサンプルを以下に示す.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
int main()
{
struct passwd *pw;
/* getuid()でuidを取得 */
fprintf(stdout,"UID=%d\n",getuid());
/* getlogin()でログイン名を取得 */
fprintf(stdout,"LOGIN NAME=%s\n",getlogin());
fprintf(stdout,"=============================================\n");
/* getpwuid(uid_t uid)でuidからpasswd構造体を取得 */
pw=getpwuid(6);
/* passwd構造体の各メンバを表示 */
fprintf(stdout,"LOGIN NAME=%s\n",pw->pw_name);
fprintf(stdout,"UID=%d\n",pw->pw_uid);
fprintf(stdout,"GID=%d\n",pw->pw_gid);
fprintf(stdout,"$HOME=%s\n",pw->pw_dir);
fprintf(stdout,"Default shell=%s\n",pw->pw_shell);
fprintf(stdout,"=============================================\n");
/* getpwnam(const char *name)でログイン名からpasswd構造体を取得 */
pw=getpwnam("nobody");
/* passwd構造体の各メンバを表示 */
fprintf(stdout,"LOGIN NAME=%s\n",pw->pw_name);
fprintf(stdout,"UID=%d\n",pw->pw_uid);
fprintf(stdout,"GID=%d\n",pw->pw_gid);
fprintf(stdout,"$HOME=%s\n",pw->pw_dir);
fprintf(stdout,"Default shell=%s\n",pw->pw_shell);
fprintf(stdout,"=============================================\n");
/* パスワードファイルから全エントリを順次取り出す. */
fprintf(stdout,"NAME\tUID\tGID\t$HOME\t\tDefaultShell\n");
/* パスワードファイル内の位置を設定 */
setpwent();
/* getpwent()でパスワードファイル内のエントリからpasswd構造体を取得 */
while((pw=getpwent())!=NULL){
/* passwd構造体の各メンバを表示 */
fprintf(stdout,"%s\t",pw->pw_name);
fprintf(stdout,"%d\t",pw->pw_uid);
fprintf(stdout,"%d\t",pw->pw_gid);
fprintf(stdout,"%s\t\t",pw->pw_dir);
fprintf(stdout,"%s\n",pw->pw_shell);
}
/* endpwent()で終了処理 */
endpwent();
exit(0);
}
実行結果は省略.

