linux c st_mode快速获得用户、组、其他的文件权限

最近linux老师布置了让实现ls -l命令,stat结构的st_mode成员是存储文件类型、文件权限的int型数,存储权限用的是低9位,这九位的前三位是用户的读写执行权限(rwx),中三位是组的读写执行权限,最后三位是其他的读写执行权限。rwx r-- -wx就表示为111 100 011。
stat.h里面提供的宏定义只能判断用户/组/其他 对某个文件是否仅拥有一个权限,如只能识别100 000 000或者是000 100 000诸如此类这九位当中只有一位是1,其他是0的情况(如果我漏看了,存在其他便捷的宏勿喷)。思路主要是通过掩码,将三者权限分别判断,并通过移位来判断某人具体有哪种权限来实现。下面是根据st_mode获得这三者权限的代码:

#include<sys/stat.h>
//以下三行是对st_mode掩码并移位,使它只有低三位有用。
unsigned short usr_permi=((st_mode&S_IRWXU)>>6);
unsigned short grp_permi=((st_mode&S_IRWXG)>>3);
unsigned short oth_permi=st_mode&S_IRWXO;
static inline void PrintPermission(const unsigned short masked_code){//经过掩码并移位后只剩用户/组/其他三者其一的三位,即0000 0000 0000 0xxx(假设short为16位)
    if((unsigned short)(masked_code>>2))putchar('r');
    else putchar('-');
    if((unsigned short)((masked_code>>1)<<(sizeof(short)*8-1)))putchar('w');
    else putchar('-');
    if((unsigned short)(masked_code<<(sizeof(short)*8-1)))putchar('x');
    else putchar('-');
}

需要注意的是要用无符号类型,作为条件判断等表达式的时候记得加上强制类型转换,不然会自动类型提升为int溢出导致结果不如预期,换成unsigned int也是可以的,unsigned short省点空间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值