umask

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-05-01 /process-umask.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html

■umaskの影響

ファイルやディレクトリを新たに作る時にどのようなモードになるかは、次の 2つで決まる。
  1. ファイルやディレクトリを作るプログラムの中で指定したモード
  2. マスク
実際に作られるファイルのモードは、1. から 2. を引いた値になる。同じプ ログラムを使ったとしても、マスクの値によっては、作られるファイルのモー ドが違ってくる。

マスクの影響と操作

マスクの表示

マスクを見るには、umask コマンドコマンドを使う。
----------------------------------------------------------------------
% umask [←]
22
% []
----------------------------------------------------------------------
YHM_umask コマンドは、シェルの 内部コマンドである。マスクは、プロセスの属性の1つで、 子プロセス、孫プロセスと代々受け 継がれていきく。現在のシェルのマスクを見れば、 シェルから実行されるプロセスのマスクがわかる。

umask を操作するシステム・コールは、umask(コマンドと同じ名前)である。

マスクは、モードと同じく8進数で考える。たとえば、022 は、次のように 読む。

----------------------------------------------------------------------

   ---       000 新しいファイルは、自分自身は、読み書き自由。
      -w-    020 同じグループの人は、ファイルの書込みを禁止する。
+)       -w- 002 その他の人も、ファイルの書込みを禁止する。
----------------
             022

----------------------------------------------------------------------
このように、モードの逆になる。

マスクを変えよう

マスクを変えるには、umask コマンドに、引数を与えて実行します。
----------------------------------------------------------------------
% umask [←]
22
%
% umask 066 [←]
% umask [←]
66
% []
----------------------------------------------------------------------
この例では、シェルのマスクを 022 から 066 へ変更しています。

umask コマンドによるマスクの設定は、 普通、~/.cshrc~/.login に入れる。 rsh コマンド時も実行さ れるように、~/.cshrc に入れて置くのが無難である。

普通のファイルを作る時のマスクの影響

新しくファイルを作る時、そのモードは、最大 666 (rw-rw-rw-)になることが多い。これは、ファイルを作るプロ グラム(cp, mule などで)で、次のようにファイルを作っていることに由来す る。
	open("file1",O_CREAT|O_TRUNC,0666);
すると、UNIXオペレーティング・システムのカーネルは、システム・コールの 引数とマスクを保持している変数 mask を使って
	mode = 0666 & ~mask ;
というモードのファイルを作る。「&」 は、ビットごとのAND、「~」は、ビット反 転である。この場合、繰り下がりがないので、
	mode = 0666 - mask ;
と考えてもよい。結果として、マスクの部分のビットが落ちたモード を持つファイルが作られる。

たとえば、マスクが 022 の時、作 成されるファイルのモードは、666からマスクの022を引くので、次のように 644 (rw-r--r--) になる。


----------------------------------------------------------------------
% umask [←]
22
% echo "This is file1" > file1 [←]
% ls -l file1 [←]
-rw-r--r--  1 yas            14 Sep 14 17:25 file1
% []
----------------------------------------------------------------------
マスクを 0 にして、同じことをすると、モードが 666 になる。

----------------------------------------------------------------------
% umask 000 [←]
% umask [←]
0
% rm file1 [←]
% echo "This is file1" > file1 [←]
% ls -l file1 [←]
-rw-rw-rw-  1 yas            14 Sep 14 17:29 file1
% []
----------------------------------------------------------------------

マスクは、新しくファイルを作る時にのみ有効である。すでに、ファイルが存 在する場合、ファイルに書込みをしても、モードは変わらない。たとえば、


----------------------------------------------------------------------
% chmod 777 file1 [←]
% ls -l file1 [←]
-rwxrwxrwx  1 yas            14 Jan 23 16:28 file1
% umask 022 [←]
% echo "a" > file1 [←]
% ls -l file1 [←]
-rwxrwxrwx  1 yas             2 Jan 23 18:05 file1
% []
----------------------------------------------------------------------

ディレクトリを作る時のマスクの影響

新しくディレクトリを作る時、そのモードは、最大 777 (rwxrwxrwx)になることが多い。これは、ディレクトリを作る プログラムが、
	mkdir("dir1",0777 );
となっているからである。この結果、ファイルと同様に
	mode = 0777 & ~mask
というモードを持つディレクトリが作られる。

たとえば、マスクが 022 の時、作成されるディレクトリのモードは、777から マスクの022を引くので、次のように 755 (rwxr-xr-x) に なる。


----------------------------------------------------------------------
% umask [←]
22
% mkdir dir1 [←]
% ls -ld dir1 [←]
drwxr-xr-x  2 yas           512 Jan 23 18:09 dir1
% []
----------------------------------------------------------------------
マスクを 0 にして、同じことをすると、

----------------------------------------------------------------------
% umask 0 [←]
% rmdir dir1 [←]
% mkdir dir1 [←]
% ls -ld dir1 [←]
drwxrwxrwx  2 yas           512 Jan 23 18:09 dir1
% []
----------------------------------------------------------------------
新しく YHM_mkdir() コマンドで作ったディレクトリの モードが 777 になる。
↑[もどる] ←[4月24日] ・[5月01日] →[5月08日] [課題]
Last updated: 2000/04/30 20:12:45
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>