Linux C 实现ls庖丁解牛(2)

st_mode本身就是一个16位的二进制,前四位是文件的类型,紧接着三位是文件的特殊权限,最后的九位就是ls -l列出来的九个权限。如何把st_mode转换成对应的权限就是权限处理这块的关键了。

Linux本身提供了很多测试宏来测试文件的类型的。

#define __S_IFMT        0170000 /* These bits determine file type.  */

/* File types.  */

#define __S_IFDIR      0040000 /* Directory.  */

#define __S_IFCHR      0020000 /* Character device.  */

#define __S_IFBLK      0060000 /* Block device.  */

#define __S_IFREG      0100000 /* Regular file.  */

#define __S_IFIFO      0010000 /* FIFO.  */

#define __S_IFLNK      0120000 /* Symbolic link.  */

#define __S_IFSOCK      0140000 /* Socket.  */


# define S_IFMT        __S_IFMT
# define S_IFDIR        __S_IFDIR
# define S_IFCHR        __S_IFCHR
# define S_IFBLK        __S_IFBLK
# define S_IFREG        __S_IFREG


利用上面的测试宏就可以判断文件的类型,至于文件的权限部分可以使用掩码的方式来处理。

具体代码如下:

void mode_to_letters(int mode,char str[])

{

//S_IS***测试宏

strcpy(str,"----------");

if(S_ISDIR(mode))str[0] = 'd';

if(S_ISCHR(mode))str[0] = 'c';

if(S_ISBLK(mode))str[0] = 'b';

//与 掩码

if(mode&S_IRUSR)str[1] = 'r';

if(mode&S_IWUSR)str[2] = 'w';

if(mode&S_IXUSR)str[3] = 'x';

if(mode&S_IRGRP)str[4] = 'r';

if(mode&S_IWGRP)str[5] = 'w';

if(mode&S_IXGRP)str[6] = 'x';

if(mode&S_IROTH)str[7] = 'r';

if(mode&S_IWOTH)str[8] = 'w';

if(mode&S_IXOTH)str[9] = 'x';

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ae072d8cc2621898ea3b84353149f438.html