linux 用函数写出 ls -l 命令 的文件属性 (~~~超级详细)(上)

由于偷懒,第一次写博客,先写个简单的吧      (~o ̄3 ̄)~

有不对的地方希望指正     ((*・∀・)ゞ→→

最近在写ls命令时有涉及到这一部分,怎样将 通过获取文件属性函数 ---- stat  所获得的东西

转换成我们在Shell下输入ls -l所得到的样子,就是这样的:

那么,我们一步一步的来:

1.首先是先调用stat函数获得该文件或者目录信息

                 不要忘记头文件  ヾ(≧O≦)〃

#include
#include
#include
#include
#include
    struct stat buf;
    if(stat(file_name,&buf)==-1)                                                                                                              
    {
        my_err("stat",__LINE__);
    }

buf 这个结构体里就存的是file_name这个目录的信息啦!

这个my_eer是自己定义的报错函数,可以有效查找在哪里出的错(在后面的全部代码里会有)

关于stat结构体里的东西

Linux是这样定义的:

struct stat {

        dev_t      st_dev;        //文件的设备编号
        ino_t      st_ino;        //文件的i-node节点号
        mode_t     st_mode;       //文件的类型和存储权限
        nlink_t    st_nlink;      //连到该文件的硬链接数目
        uid_t      st_uid;        //文件所有者用户ID
        gid_t      st_gid;        //文件所有者的组ID
        dev_t      st_rdev;       //若此文件为设备文件,则为其编号设备
        off_t      st_size;       //文件大小
        blksize_t st_blksize;     //文件系统的I/O缓冲区大小
        blkcnt_t   st_blocks;     //占用文件区块的个数
        time_t     st_atime;      //文件最近一次被访问的时间
        time_t     st_mtime;      //文件最近一次被修改的时间
        time_t     st_ctime;      //文件最近一次被更改的时间(文件所有者,所属组,文件权限被更改时)

};

2.然后开始解析结构体里的内容,将它们转换为我们需要的东西,首先是文件类型信息

对于st_mode包含的文件信息,POSIX标准定义了一系列的宏。

是这样定义的:

S_ISLNK(st_mode)        判断是否位符号链接
S_ISREG(st_mode)        判断是否为一般文件
S_ISDIR(st_mode)        判断是否为目录文件
S_ISCHR(st_mode)        判断是否为字符设备文件
S_ISBLK(st_mode)        判断是否为块设备文件
S_ISFIFO(st_mode)       判断是否为先进先出FIFO
S_ISSOCK(st_mode)       判断是否为socket

那么我们就可以这样实现:   (。・∀・)ノ゙

    if(S_ISLNK(buf.st_mode))
	    printf("l");
    else if(S_ISREG(buf.st_mode))
	    printf("-");
    else if(S_ISDIR(buf.st_mode))
	    printf("d");
    else if(S_ISCHR(buf.st_mode))
	    printf("c");
    else if(S_ISBLK(buf.st_mode))
	    printf("b");
    else if(S_ISFIFO(buf.st_mode))
	    printf("f");
    else if(S_ISSOCK(buf.st_mode))
	    printf("s");    

3.然后是下一个存取权限

Linux是这样定义的:

S_IRUSR     00400       文件所有者具可读取权限
S_IWUSR     00200       文件所有者具可写入权限
S_IXUSR     00100       文件所有者具可执行权限

S_IRGRP     00040       用户组具可读取权限
S_IWGRP     00020       用户组具可写入权限
S_IXGRP     00010       用户组具可执行权限

S_IROTH     00004       其他用户具可读取权限
S_IWOTH     00002       其他用户具可写入权限
S_IXOTH     00001       其他用户具可执行权限

我们也可以按照上面的做法,一个一个对比,比如:

    if(buf.st_mode & S_IRUSR)
        printf("r");

但是我觉得太麻烦了~~~

得写9个呢  ~Σ(っ °Д °;)っ

而且敲那些大写字母,真的是又记不住,又容易错!!!    (@_@;)

所以我是这个样子实现滴~

我们都知道,权限一般可以表示为数字,比如  742 就是  rwx r-- -x-  ,但是在 buf 的 st_mode 中,是以八进制来表示的,没关系,一样用!!而且非常简单

看下一篇~~~

你可能感兴趣的:(linux 用函数写出 ls -l 命令 的文件属性 (~~~超级详细)(上))