Linux 的文件属性的数字表示

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  ,具体写起来也很复杂的,主要是不同的系统就不一样

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。