umask関数 - ビットマスクでパーミッションを制限する
ビットマスクを指定するにはumask関数を使用します。
# 8進数で指定 umask 0022;
ビットマスクを指定するには、umask関数を使います。パーミッションの指定は3桁の8進数で行います。Perlでは先頭に0をつけることで8進数をあらわすことができます。
ファイル作成時のパーミッションはビットマスクに影響を受けます。ビットマスクとはファイルやディレクトリの作成時のパーミッションを制限するビット列です。以下は、ビットマスクを指定するサンプルです。
ビットマスクとは
ビットマスクはsysopen関数やmkdir関数でのファイルやディレクトリの作成時のパーミッションに影響を及ぼします。
たとえばsysopen関数で指定するパーミッションが666で、ビットマスクの設定が022だった場合、作成されるファイルのパーミッションは644になります。
ファイルをプログラムで作成する場合は、パーミッションの値をファイルの場合は666、実行ファイルやディレクトリの場合は777にしておくほうがよいです。こうしておけば、そのプログラムを使う人はビットマスクを指定することで作成するパーミッションを自由に変更できます。
(ただし他人に絶対に書き込まれてはいけないファイルなどの場合は、644のパーミッションなどで作成します。)
ビットマスクによる演算
ビットマスクの演算は以下のようになります。
作成されるパーミッション = 指定したパーミッション & ビットマスクの否定
わかりにくいので例で解説します。指定するパーミッションが8進数で666、ビットマスクが022だとします。
ビット演算を行うので、2進数に直して考えます。8進数の666は2進数で110110110で、8進数の022は2進数で000010010です。
否定とは、ビットを反転させることです。& は、ビットの論理積で、両方が1のときは1,それ以外は0になります。
ファイルパーミッション | 1 | 1 | 0 |
(ビットマスク) | 0 | 0 | 0 |
ビットマスクの否定 | 1 | 1 | 1 |
作成されるパーミッション | 1 | 1 | 0 |
「ファイルパーミッション」と「ビットマスクの否定」の論理積が「作成されるパーミッション」になります。
サンプル
ビットマスクを設定するサンプルです。
use strict; use warnings; # ファイルモード指定のための定数をインポート use Fcntl; # ビットマスクの設定 8進数で指定 umask 0022; # 上書きするので注意 my $file = "file_20080824_$$"; # パーミッションの値はビットマスクに影響を受けて644となる。 sysopen(my $fh, $file, O_CREAT | O_WRONLY, 0666) or die "Cannot open $file: $!"; close $fh or die "Cannnot close $file"; # パーミッションの値はビットマスクに影響を受けて755になる。 # 上書きするので注意 my $dir = "dir_20080824_$$"; mkdir($dir, 0777) or die "Cannot make $dir";