Perl Perl_4 パーミッション
Perl 関数「 stat 」のフィールド (0x214)
![Perl 関数「 stat 」のフィールド (0x214) Perl 関数「 stat 」のフィールド (0x214)](http://img04.ti-da.net/usr/p/o/i/pointoht/20150416perl.png)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x214 回。
Perl 組込みの関数「 stat() 」で得られる各フィールドを確認します。
Perl 関数「 stat() 」
前回 (0x213) で、Perl の組込み関数「 stat() 」の動作を確認するためのプログラムコードを書いてみました。
今回は、stat - perldoc.jp で解説されている、各フィールドを確認します。
関数「 stat() 」の各フィールド
関数「 stat() 」をリストコンテキストで実行する場合は次のように値を受け取ります。
my ($dev,$ino,$mode,$nlink,
$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,
$blocks) = stat($file);
# または
my @status = stat($file);
関数「 stat 」で得られる各フィールドの値は次のものです。
Index | 名前 | 情報 |
---|---|---|
0 | dev | ファイルシステムのデバイス番号 |
1 | ino | inode 番号 |
2 | mode | ファイルモード (タイプとパーミッション, 10 進数なので 8 進数に置き換えると分かりやすい) |
3 | nlink | ファイルへの (ハード) リンク数 |
4 | uid | ファイル所有者のユーザ ID の数値 |
5 | gid | ファイル所有者のグループ ID の数値 |
6 | rdev | デバイス識別子 (特殊ファイルのみ) |
7 | size | ファイルサイズ (byte) |
8 | atime | 紀元から最後にアクセス (access) された時刻までの秒数 |
9 | mtime | 紀元から最後に修正 (modify) された時刻までの秒数 |
10 | ctime | 紀元から inode が変更 (change) された時刻までの秒数 |
11 | blksize | ファイルとの相互作用のために適した I/O byte 数 ( ブロックサイズ ) |
12 | blocks | ディスクに割り当てたシステム依存のブロック数 (大抵は 512 byte/1 block) |
関数「 stat() 」をスカラコンテキストで利用すると、情報の取得が成功したか否かの 真偽 値 ( 0 or 1 ) を返します。
スカラコンテキストで 真 の値が返された場合は、対照するファイルに関連する情報を仮想ファイルハンドル「 _ 」にセットするので、そのままファイルテストを行うことが出来ます。
必要な値を取り出す
配列変数に格納した値は、「 Index 」( 添え字 ) を使って任意に取り出せます。
# dev
my $dev = $status[0];
# uid
my $uid = $status[4];
# atime
my $atime = $status[8];
今後確認する予定の「 配列のスライス 」を利用すれば、次のように必要な値だけを直接取り出すこともできます。
$mode = (stat($file))[2];
「 mode 」
Index「 2 」の「 mode 」は、ファイルタイプとファイルパーミッションの情報を持っているといいますが、生の状態ではどこがファイルタイプでどこがファイルパーミッションなのかが分かりません。
例えば、
printf "mode: %d", $mode;
で得られるのは
mode: 33204
です。
この数値を理解しやすくするためには、まず 8 進数に変換する必要があります。
# フォーマット %d を %o に変更
printf "mode: %o", $mode;
すると、次の数値が得られます。
mode: 100664
この数値の意味は、「 man 2 stat 」にあります。それは「 stat(2) 」のマニュアルページで「 システムコール 」としての「 stat 」を解説しています。「 man stat 」とした場合に得られる解説は「 stat(1) 」で、これは「 コマンド 」としての「 stat 」を解説しています。
stat(2)
システムコール「 stat 」のマニュアルページでは次のように数値の意味が解説されています。
#define S_IFMT 0170000 /* type of file mask */
#define S_IFIFO 0010000 /* named pipe (fifo) */
#define S_IFCHR 0020000 /* character special */
#define S_IFDIR 0040000 /* directory */
#define S_IFBLK 0060000 /* block special */
#define S_IFREG 0100000 /* regular */
#define S_IFLNK 0120000 /* symbolic link */
#define S_IFSOCK 0140000 /* socket */
#define S_IFWHT 0160000 /* whiteout */
#define S_ISUID 0004000 /* set user id on execution */
#define S_ISGID 0002000 /* set group id on execution */
#define S_ISVTX 0001000 /* save swapped text even after use */
#define S_IRWXU 0000700 /* RWX mask for owner */
#define S_IRUSR 0000400 /* read permission, owner */
#define S_IWUSR 0000200 /* write permission, owner */
#define S_IXUSR 0000100 /* execute/search permission, owner */
#define S_IRWXG 0000070 /* RWX mask for group */
#define S_IRGRP 0000040 /* read permission, group */
#define S_IWGRP 0000020 /* write permission, group */
#define S_IXGRP 0000010 /* execute/search permission, group */
#define S_IRWXO 0000007 /* RWX mask for other */
#define S_IROTH 0000004 /* read permission, other */
#define S_IWOTH 0000002 /* write permission, other */
#define S_IXOTH 0000001 /* execute/search permission, other */
上記解説によれば、前項で得られた 8 進数「 100664 」の内「 100 」( man では 0100000 ) がファイルタイプ ( regular = レギュラーファイル ) を、「 664 」がファイルパーミッションを表していることが分かります。
例えば、パーミッション「 755 」のディレクトリが対象である場合は、8 進数で「 40775 」の数値が得られます。
REF: 3283 Re: Perlのstat関数で取得できるファイルモード
0x214 -> 0x215 へ
次回は、前回 (0x213) で関数「 stat() 」の動作確認に利用したプログラムコードの各部分を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)