システムプログラム(第8週): umaskの影響


電子・情報工学系/システム情報工学研究科CS専攻
新城 靖
<yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2005/No8_files/umask.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2005/
http://www.coins.tsukuba.ac.jp/~yas/

umaskの影響

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

マスクの影響と操作

マスクの表示

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

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

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


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

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

マスクを変える

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

umask コマンドによるマスクの設定は、 普通、~/.cshrc~/.login に入れる。 ssh でリモートログインした時にも実行さ れるように、~/.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--) になる。

% ls -l file1 [←]
ls: file1: No such file or directory
% umask  [←]
22
% echo "This is file1" > file1 [←]
% ls -l file1 [←]
-rw-r--r--    1 yas      lab            14 Jun 17 00:06 file1
% []
マスクを 0 にして、同じことをすると、モードが 666 になる。
% rm file1 [←]
% umask 000 [←]
% umask [←]
0
% echo "This is file1" > file1 [←]
% ls -l file1 [←]
-rw-rw-rw-    1 yas      lab            14 Jun 17 00:07 file1
% []

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

% ls -l file1 [←]
-rw-rw-rw-    1 yas      lab            14 Jun 17 00:07 file1
% chmod 777 file1 [←]
% ls -l file1 [←]
-rwxrwxrwx    1 yas      lab            14 Jun 17 00:07 file1
% umask 022 [←]
% echo a > file1 [←]
% ls -l file1 [←]
-rwxrwxrwx    1 yas      lab             2 Jun 17 00:08 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      lab             6 Jun 17 00:08 dir1
% []
マスクを 0 にして、同じことをすると、
% ls -ld dir1 [←]
ls: dir1: No such file or directory
% umask  [←]
0
% mkdir dir1 [←]
% ls -ld dir1 [←]
drwxrwxrwx    2 yas      lab          1024 Jun 17 00:10 dir1
% []
新しく mkdir コマンドで作ったディレクトリのモードが 777 になる。

上の結果は、/tmp で試したものである。 情報学類の計算機の場合、ホーム・ディレクトリ(実体は、ファイル・サーバ 上にある)で実験すると、モードが 777 にはならない。

% rmdir dir1 [←]
% ls -ld dir1 [←]
ls: dir1: No such file or directory
% umask [←]
0
% mkdir dir1 [←]
% ls -ld dir1 [←]
drwxr-xr-x    2 yas      lab             6 Jun 17 00:14 dir1
% []

Last updated: 2005/06/11 20:19:11
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>