背景:
第一位是文件类型。这个红色框中的信息都存放在stat结构体的st_mode中。
2到4是user的权限,5到7是group的权限,8到10是other的权限,所以基本位有9位。u+s位,g+s位,o+t位。文件类型有7种,用位图来表示的话,3个二进制位就足够了。没有15位的位图,所以一定是16位。
dcb-lsp分别对应七种文件类型。
d是目录文件。
c表示字符设备文件。
b表示块设备文件。
-表示常规文件。
l表示符号链接文件。
s表示网络套接字socket文件。
p表示管道文件。
S_ISLNK(st_mode) // 是否是一个连接.
S_ISREG(st_mode) // 是否是一个常规文件.
S_ISDIR(st_mode) // 是否是一个目录
S_ISCHR(st_mode) // 是否是一个字符设备.
S_ISBLK(st_mode) // 是否是一个块设备
S_ISFIFO(st_mode) // 是否是一个FIFO文件.
S_ISSOCK(st_mode) // 是否是一个SOCKET文件
代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
static int ftype(const char *fname)
{
struct stat statres;
if (stat(fname, &statres) < 0)
{
perror("stat()");
exit(1);
}
if(S_ISREG(statres.st_mode))
return '-';
else if (S_ISDIR(statres.st_mode))
return 'd';
else if(S_ISSOCK(statres.st_mode))
return 's';
else if(S_ISCHR(statres.st_mode))
return 'c';
else if(S_ISBLK(statres.st_mode))
return 'b';
else if(S_ISFIFO(statres.st_mode))
return 'p';
else if(S_ISLNK(statres.st_mode))
return 'l';
else
return '?';
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "Usage...\n");
exit(1);
}
printf("%c\n", ftype(argv[1]));
exit(0);
}
运行,flen.c是常规文件,所以结果为-。
第一位为0,表示是八进制数,有5位,3*5再加上最高位的1,一共16位。st_mode是一个16位的位图。
#define S_IFMT 0170000
#define S_IFSOCK 0140000
#define S_IFLNK 0120000
#define S_IFREG 0100000
#define S_IFBLK 0060000
#define S_IFDIR 0040000
#define S_IFCHR 0020000
#define S_IFIFO 0010000
// u+s位,g+s位,t位
#define S_ISUID 0004000
#define S_ISGID 0002000
#define S_ISVTX 0001000
// 表示的是owner的权限
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
// 次低三次保留的是group用户的权限。
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
// 最低三位表示的是other用户的权限,想保留低三位的话,st_mode就与S_IRWXO按位与,前面都被抹掉,只保留第三位。
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
st_mode是一个16位的位图,用于表示文件类型,文件访问权限,及特殊权限位。