PerlならサンプルコードPerl入門

2008-08-24

umask関数 - ビットマスクでパーミッションを制限する

  1. Perl
  2. ファイル操作
  3. 関数
  4. 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になります。

ファイルパーミッション110110110
(ビットマスク)000010010
ビットマスクの否定111101101
作成されるパーミッション110100100

 「ファイルパーミッション」と「ビットマスクの否定」の論理積が「作成されるパーミッション」になります。

サンプル

 ビットマスクを設定するサンプルです。

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";

cyubaki3cyubaki3 2016/11/24 11:22 「ビットマスクによる演算」の作成されるパーミッションが
110110110
となっていますが
110100100
ではないでしょうか?

perlcodesampleperlcodesample 2016/11/24 22:43 そうですね。ご指摘ありがとうございます。修正しました。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証