从stat结构体的st_mode成员中获取文件的权限信息

首先,我们来看一下mode_t类型的结构

 

可以看出,文件的权限位于这个变量的最后9位上。

 

这是特征位的定义

  1. S_IFMT      0170000     文件类型的位遮罩  
  2. S_IFSOCK    0140000     socket  
  3. S_IFLNK     0120000     符号链接(symbolic link)  
  4. S_IFREG     0100000     一般文件  
  5. S_IFBLK     0060000     区块装置(block device)  
  6. S_IFDIR     0040000     目录  
  7. S_IFCHR     0020000     字符装置(character device)  
  8. S_IFIFO     0010000     先进先出(fifo)  
  9. S_ISUID     0004000     文件的(set user-id on execution)位  
  10. S_ISGID     0002000     文件的(set group-id on execution)位  
  11. S_ISVTX     0001000     文件的sticky位  
  12. S_IRWXU     00700       文件所有者的遮罩值(即所有权限值)  
  13. S_IRUSR     00400       文件所有者具可读取权限  
  14. S_IWUSR     00200       文件所有者具可写入权限  
  15. S_IXUSR     00100       文件所有者具可执行权限  
  16. S_IRWXG     00070       用户组的遮罩值(即所有权限值)  
  17. S_IRGRP     00040       用户组具可读取权限  
  18. S_IWGRP     00020       用户组具可写入权限  
  19. S_IXGRP     00010       用户组具可执行权限  
  20. S_IRWXO     00007       其他用户的遮罩值(即所有权限值)  
  21. S_IROTH     00004       其他用户具可读取权限  
  22. S_IWOTH     00002       其他用户具可写入权限  
  23. S_IXOTH     00001       其他用户具可执行权限  
  24. 摘自《Linux C 函数库参考手册》  

于是我尝试用这样的语句获取权限特征位:

printf("%o %o %o\n", buff.st_mode&S_IRWXU, buff.st_mode&S_IRWXG, buff.st_mode&S_IRWXO);

但得到的输出是700 60 6

于是我把代码写成了这样

printf("%o\n", (buff.st_mode&S_IRWXU)+(buff.st_mode&S_IRWXG)+(buff.st_mode&S_IRWXO));

就得到了正确的结果:766。

这里需要说明的是,貌似C中+号的运算优先级比&高,所以要使用括号来保证按位与运算先进行。