Linux 文件或目录的属性的二进制表示:
<?php
$f = $argv[1];
echo sprintf(‘%016s’,decbin(fileperms($f))) ."\n";
?>
每个二进制位代表特殊的含义:
从高到低:
1 说明是文件, 否则是目录
1 如果是文件,说明是sock文件
1 不知道
1 如果是文件,说明是pipe文件
1 属主的s位
1 属组的s位
1 粘着位t
1 属主可读
1 属主可写
1 属主可执行
1 属组可读
1 属组可写
1 属组可执行
1 其他用户可读
1 其他用户可写
1 其他用户可执行
将数字转换成字母的形式,php
<?php
define("S_ISUID",04000);
define("S_ISGID",02000);
define("S_ISVTX",01000);
define("S_IRUSR",0400);
define("S_IWUSR",S_IRUSR >> 1);
define("S_IXUSR",S_IRUSR >> 2);
define("S_IRGRP",S_IRUSR >> 3);
define("S_IWGRP",S_IRUSR >> 4);
define("S_IXGRP",S_IRUSR >> 5);
define("S_IROTH",S_IRUSR >> 6);
define("S_IWOTH",S_IRUSR >> 7);
define("S_IXOTH",S_IRUSR >> 8);
$mode = fileperms($argv[1]);
echo strmode($mode) ."\n";
function strmode($mode) {
$str = ”;
$str .= $mode & S_IRUSR ? ‘r’ : ‘-‘;
$str .= $mode & S_IWUSR ? ‘w’ : ‘-‘;
$str .= ($mode & S_ISUID
? ($mode & S_IXUSR ? ‘s’ : ‘S’)
: ($mode & S_IXUSR ? ‘x’ : ‘-‘));
$str .= $mode & S_IRGRP ? ‘r’ : ‘-‘;
$str .= $mode & S_IWGRP ? ‘w’ : ‘-‘;
$str .= ($mode & S_ISGID
? ($mode & S_IXGRP ? ‘s’ : ‘S’)
: ($mode & S_IXGRP ? ‘x’ : ‘-‘));
$str .= $mode & S_IROTH ? ‘r’ : ‘-‘;
$str .= $mode & S_IWOTH ? ‘w’ : ‘-‘;
$str .= ($mode & S_ISVTX
? ($mode & S_IXOTH ? ‘t’ : ‘T’)
: ($mode & S_IXOTH ? ‘x’ : ‘-‘));
return $str;
}
?>
还没写完呢,还会更新呢
具体代码参考coreutils-6.10\lib 下面的如下文件:filemode.h filemode.c sys_stat.h ,具体写起来也很复杂的,主要是不同的系统就不一样