システム・プログラム
電子・情報工学系
新城 靖
<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() システムコールを使う。