ユーザとグループ

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <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

■ユーザとグループ

◆ユーザ

ユーザ(user, 利用者)とは、コンピュータの外 の世界では、コンピュータを使う人間のことである。 コンピュータの内部では、人間を ユーザ名(user name) という文字列 ( YHM_Chapter_Ref(02-010,第02-010章 ログインとログアウト/ユーザ名) ) または、それとほぼ1対1に対応した16ビットの整数(Irixでは32ビット)で表す。 こ の数を UID(user ID, user identifier) という。

Unixでは、全てのファイルやプロセスは、あるユーザの所有物である。これを、 Unixでは、ファイルとプロセスに属性として、UID を持たせることで実現して いる。

図? 実世界のユーザとUNIX中のプロセス・ファイル

図? 実世界のユーザとUNIX中のプロセス・ファイル

◆グループ

グループ(group)とは、コンピュータの世界では、 コンピュータ を使う人間の集合 のことである。コンピュータの内部では、ユーザ名/UIDと同様に、 グループ名(group name) と呼ばれる文字列、 または、それとほぼ1対1に対応した16ビッ トの整数で表す。この数を GID(group ID, group identifier) と言う。

1人のユーザが複数のグループに属することがある。

■ユーザの表現

IRIX では、ユーザを32ビット(伝統的なUNIXでは16ビット)の整数で表わす。 この整数を UID と呼ぶ。プロセスやファイルには、属性としてUID がある。
----------------------------------------------------------------------
   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-print [←]
1231: yas
0: root
% []
----------------------------------------------------------------------

■練習問題

★練習問題23 gidの表示

プロセスの GID属性を表示するプログラムを作りなさい。

注意:getgid() システムコールや getgroups() システムコールを使う。


↑[もどる] ←[4月24日] ・[5月01日] →[5月08日] [課題]
Last updated: 2000/04/30 21:05:25
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>