システム・プログラム 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-05-01
/user.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。これを、
Unixでは、ファイルとプロセスに属性として、UID を持たせることで実現して
いる。
図? 実世界のユーザとUNIX中のプロセス・ファイル
1人のユーザが複数のグループに属することがある。
---------------------------------------------------------------------- 1: /* 2: proc-uid-print.c -- 現在のプロセスのUIDを表示するプログラム。 3: ~yas/syspro1/proc/proc-uid-print.c 4: $Header: /home/lab2/OS/yas/syspro1/user/RCS/uid-print.c,v 1.2 1998/05/18 14:43:10 yas Exp $ 5: Start: 1998/05/18 23:20:16 6: */ 7: 8: #include <sys/types.h> /* getuid(2) */ 9: #include <unistd.h> /* getuid(2) */ 10: #include <pwd.h> /* getpwuid(3) */ 11: #include <grp.h> /* getgrgid(3) */ 12: 13: #if 0 14: typedef o_uid_t o_gid_t; /* old GID type */ 15: typedef long uid_t; 16: extern uid_t getuid(void); 17: #endif 18: 19: extern char *uid2uname(uid_t uid); 20: extern char *gid2gname(gid_t gid); 21: 22: main() 23: { 24: uid_t uid ; 25: uid = getuid(); 26: printf("%d: %s\n",uid,uid2uname(uid) ); 27: uid = 0 ; 28: printf("%d: %s\n",uid,uid2uname(uid) ); 29: } 30: 31: char *uid2uname(uid_t uid) 32: { 33: struct passwd *pwd ; 34: pwd = getpwuid( uid ); 35: if( pwd ) 36: return( pwd->pw_name ); 37: else 38: { 39: static char buf[100] ; /* must be static, bad for multithreading */ 40: sprintf(buf,"%d",uid ); 41: return( buf ); 42: } 43: } 44: 45: char *gid2gname(gid_t gid) 46: { 47: struct group *grp ; 48: grp = getgrgid( gid ); 49: if( grp ) 50: return( grp->gr_name ); 51: else 52: { 53: static char buf[100] ; /* must be static, bad for multithreading */ 54: sprintf(buf,"%d",gid ); 55: return( buf ); 56: } 57: } ----------------------------------------------------------------------
---------------------------------------------------------------------- % ./proc-uid-print1231: yas 0: root %
----------------------------------------------------------------------
注意:getgid() システムコールや getgroups() システムコールを使う。