现在我们来简洁的实现命令:了解一下相关知识:

我们使用掩码可以很明确的得出文件的每一种信息。关于掩码,上图中的S_IRUSR等均为掩码。我们来看看函数getpwuid,原型:struct passwd *getpwuid(uid_t uid);头文件:#include <pwd.h>。
getpwuid()用来逐一搜索参数uid 指定的用户识别码, 找到时便将该用户的数据以结构体的形式返回。该函数的返回值是一个结构体passwd 。我们来看看这个结构体:

struct
passwd {

    char *pw_name; /* username */

    char *pw_passwd; /* user password */

    uid_t pw_uid; /* user ID */

    gid_t pw_gid; /* group ID */

    char *pw_gecos; /* user information */

    char *pw_dir; /* home directory */

    char *pw_shell; /* shell program */

};

结构体已经很清楚明了了。所以我们很容易可以得到用户名。我们再来看另一个函数:getgrgid(),函数原型:struct group *getgrgid(gid_t gid);头文件:#include <grp.h>。和getpwuid类似。结构体group:

struct
group {

    char *gr_name; /* group name */

    char *gr_passwd; /* group password */

    gid_t gr_gid; /* group ID */

    char **gr_mem; /* NULL-terminated array of pointers

                            to names of group members */

};

所以文件所属组也很容易得到。

所以整体上很容易了:

#include
<stdio.h>

#include
<string.h>

#include
<sys/types.h>

#include
<sys/stat.h>

#include
<stdlib.h>

#include
<time.h>

#include
<pwd.h>

#include
<grp.h>

 

 

int main(int
argc, char* argv[])

{

    if (argc < 2)

    {

        printf(". / a.out filename\n");

        exit(1);

    }

 

    struct
stat st;

    int ret = stat(argv[1], &st);

    if (ret == -1)

    {

        perror("stat");

        exit(1);

    }

 

    // 存储文件类型和访问权限

    char perms[11] = { 0 };

    // 判断文件类型

    switch (st.st_mode & S_IFMT)

    {

    case
S_IFLNK:

        perms[0] = 'l';

        break;

    case
S_IFDIR:

        perms[0] = 'd';

        break;

    case
S_IFREG:

        perms[0] = ' - ';

        break;

    case
S_IFBLK:

        perms[0] = 'b';

        break;

    case
S_IFCHR:

        perms[0] = 'c';

        break;

    case
S_IFSOCK:

        perms[0] = 's';

        break;

    case
S_IFIFO:

        perms[0] = 'p';

        break;

    default:

        perms[0] = ' ? ';

        break;

    }

    // 判断文件的访问权限

    // 文件所有者

    perms[1] = (st.st_mode & S_IRUSR) ? 'r' : ' - ';

    perms[2] = (st.st_mode & S_IWUSR) ? 'w' : ' - ';

    perms[3] = (st.st_mode & S_IXUSR) ? 'x' : ' - ';

    // 文件所属组

    perms[4] = (st.st_mode & S_IRGRP) ? 'r' : ' - ';

    perms[5] = (st.st_mode & S_IWGRP) ? 'w' : ' - ';

    perms[6] = (st.st_mode & S_IXGRP) ? 'x' : ' - ';

    // 其他人

    perms[7] = (st.st_mode & S_IROTH) ? 'r' : ' - ';

    perms[8] = (st.st_mode & S_IWOTH) ? 'w' : ' - ';

    perms[9] = (st.st_mode & S_IXOTH) ? 'x' : ' - ';

 

    // 硬链接计数

    int linkNum = st.st_nlink;

    // 文件所有者

    char* fileUser = getpwuid(st.st_uid)->pw_name;

    // 文件所属组

    char* fileGrp = getgrgid(st.st_gid)->gr_name;

    // 文件大小

    int fileSize = (int)st.st_size;

    // 修改时间

    char* time = ctime(&st.st_mtime);

    char mtime[512] = { 0 };

    strncpy(mtime, time, strlen(time) - 1);

 

    char buf[1024];

    sprintf(buf, "%s %d %s %s %d %s %s", perms, linkNum, fileUser, fileGrp, fileSize, mtime, argv[1]);

 

    printf("%s\n", buf);

 

    return 0;

}

简洁的实现ls-l命令的更多相关文章

  1. 实现Linux下的ls -l命令

    基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...

  2. linux下ls -l命令(即ll命令)查看文件的显示结果分析

    在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...

  3. linux ls -l命令结果含义解析

    ls -l 中显示的内容如下: -rw-r--r--.  1 root root  192 Jan 30 09:55 text.txt - 10个字符确定不同用户能对文件干什么 - 第一个字符代表文件 ...

  4. ls -l命令详解

    输入: ls -l 输出: -rwxr-xr-x root root May : b 第一个字段(1个字符):文件类型 - :普通文件 d:目录文件 b:块设备文件(block) c:字符设备文件(c ...

  5. 高仿linux下的ls -l命令——C语言实现

    主要用到的函数可以参考头文件,仅仅支持ls -l这功能,扩展就交给大家了0.0 相关测试图片: ​ ​ 话不多说,直接上码 #include <stdio.h> #include < ...

  6. 【转载】linux ls -l命令详解

    Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下: 命令: ls -lih 输出: [root@loca ...

  7. 模拟linux下的ls -l命令

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  8. linux下 ls -l 命令显示结果每一列代表什么意思

    第一个栏位,表示文件的属性.Linux的文件基本上分为三个属性:可读(r),可写(w),可执行(x).但是这里有十个格子可以添(具体程序实现时,实际上是十个bit位).第一个小格是特殊表示格,表示目录 ...

  9. Linux中 ls -l 命令显示结果中的每一列的含义

    图片转载自:https://blog.csdn.net/zhuoya_/article/details/77418413 简单解释下: 1.第一列颜色框:文件类型列,这里简单描述几种常见类型,d表示目 ...

  10. Linux 下 ls -l 命令执行显示结果的每一列含义【转载】

    转自:zhuoya_的博客 原文地址>>https://blog.csdn.net/zhuoya_/article/details/77418413

随机推荐

  1. es中的一些知识点记录

    1. forcemerge接口 强制段合并,设置为1时,是期望最终只有1个索引段.但实际情况是,合并的结果是段的总数会减少,但仍大于1,可以多次执行强制合并的命令. 设置的的目标值越小.合并消耗的时间 ...

  2. http和https的区别联系

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  3. Jquery ajax回调函数不执行

    ajax如下: $.post( "${pageContext.request.contextPath}/deptHead_assign.action", {"studen ...

  4. ElasticSearch Java API

    ElasticSearch-Java Client类型 ElasticSearch-TransportClient环境准备 ElasticSearch-TransportClient连接 Elasti ...

  5. 学习js第二天小结

    if-else if       ---------适用于区间范围的判断 If(判断条件--一般是boolean类型的值或是关系表达式或是逻辑表达式 ){ 要执行的代码; }else if(判断条件) ...

  6. 小朋友学C语言(2):安装Dev C++编译器

    (一)编译器 编译器是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序.一个现代编译器的主要工作流程:源代码 (source code) -->预处理器 (prepr ...

  7. python、javascript中的不可变对象

    比如python中str是不变对象,而list是可变对象,javascript中str也是不变对象,而array是可变对象 python的例子: >>> a = 'abc' > ...

  8. java使用zxing插件绘制二维码

    ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码. 涉及到的依赖有: < ...

  9. python-requests数据驱动延伸

    在 python-requests模块的讲解和应用 基础上进行数据驱动的延伸 task_01_requests.py #-*- coding:utf-8 -*- #task_01_requests.p ...

  10. java中的Map

    Java8增强的Map集合 Map接口中定义了如下常用的方法. void clear():删除该Map对象中的所有key-value对. boolean containsKey(Object key) ...