st_mode
st_mode st_link st_uid st_gid st_size st_atime 文件名
-rwxr-xr-x 1 root root 16168 Mar 26 08:27 a.out
- -:文件类型
- rwxr-xr-x:文件权限
- 每三个一组
- 注意第三个:如果是-,表示不可以被CPU执行,如果是x,表示可以被执行。
- 三组权限大小
- 正常情况下,所属用户的操作权限>=组员用户的操作权限>=其他不想干用户的操作权限
- 这就相当于你的私人物品
- 你就拥有最高操作权限
- 每三个一组
将数字形式的st_mode打印成-rwxr-xr-x这种形式
- st_mode的本质
- st_mode的本质就是一个数字,我们看到的rwx的形式,只是形态转换的结果。
- st_mode的组成
- 我们以二进制来分析st_mode,以二进制表示时,st_mode有16位,包含3部分信息:
- 文件类型 设置位 文件权限(如rwx rwx r-x)
- 我们以二进制来分析st_mode,以二进制表示时,st_mode有16位,包含3部分信息:
比如:例子中st_mode为33200,对应的二进制为:1000 000 110 110 000
文件类型:
15~12位表示文件类型
如何表示文件类型:
八进制 二进制
-0100000 (1000 000000000000):代表普通文件
-0040000 (0100 000000000000):代表目录文件
-0060000 (0110 000000000000):表示块设备文件
-0020000 (0011 000000000000):表示字符设备文件
-0010000 (0001 000000000000):表示管道文件
-0140000 (1100 000000000000):表示套接字文件
-0120000 (1010 000000000000):表示符号链接文件
为了方便使用,在Linux系统提供的stat.h头文件中,给以上数字定义宏名,我怎么知道是定义在stat.h中?
man stat复制
#define S_IFREG 0100000
#define S_IFDIR 0040000
#define S_IFBLK 0060000
#define S_IFCHR 0020000
#define S_IFIFO 0010000
#define S_IFSOCK 0140000
#define S_IFLNK 0120000
如何取出12~15位的值,然后用于判断文件类型
使用&操作即可实现
快速判断文件类型
为了方便我们操作,系统在stat.h中定义了相对应的带参宏,可以让我们快速判断文件类型
S_ISLNK(st_mode):是否是一个连接.
S_ISREG是否是一个常规文件.
S_ISDIR是否是一个目录
S_ISCHR是否是一个字符设备.
S_ISBLK是否是一个块设备
S_ISFIFO是否是一个FIFO文件.
S_ISSOCK是否是一个SOCKET文件
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: printf("regular file\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("unknown?\n"); break;
}