文件属性(四)——st_mode

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

  1. -:文件类型
  2. rwxr-xr-x:文件权限
    • 每三个一组
      • 注意第三个:如果是-,表示不可以被CPU执行,如果是x,表示可以被执行。
    • 三组权限大小
      • 正常情况下,所属用户的操作权限>=组员用户的操作权限>=其他不想干用户的操作权限
      • 这就相当于你的私人物品
        • 你就拥有最高操作权限

将数字形式的st_mode打印成-rwxr-xr-x这种形式

  1. st_mode的本质
    • st_mode的本质就是一个数字,我们看到的rwx的形式,只是形态转换的结果。
  2. st_mode的组成
    • 我们以二进制来分析st_mode,以二进制表示时,st_mode有16位,包含3部分信息:
      • 文件类型 设置位 文件权限(如rwx rwx r-x)

比如:例子中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;
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值