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

我们使用掩码可以很明确的得出文件的每一种信息。关于掩码,上图中的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. BloomFilter理解

    知道BloomFilter是因为RocksDB数据库中用到了这个技术,用于判断1个数据是否存在于1个SST文件中. BloomFilter可能存在误判,就是判断数据是存在集合中,而实际上可能不存在,概 ...

  2. convert 批量文件的格式转换

    1.将 a.gif 转为 png 格式 convert a.gif a.png 请注意,convert 命令的基本格式为 convert 源文件 [参数] 目标文件 在上面的命令中,源文件是 a.gi ...

  3. MariaDB基础命令

    关闭防火墙和selinux #systemctl stop firewalld 安装服务端和客户端mariadb # yum install mariadb-server mariadb -y mar ...

  4. python实现简单的登陆认证(含简单的文件操作)

    需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(本 ...

  5. java之基本数据类型

    11,java里面有没有long double类型或者比double更精度的? =========== 11,java里面有没有long double类型或者比double更精度的? java的基本数 ...

  6. [UE4]制作视野图标

    一.在PhotoShop中新建一个64px*64px,背景色为透明的文档 二.填充“图层1”为白色 三.添加蒙版图层,并将前景色设置为黑色 四.将“图层1”选择45°,并往上拖放至如图位置 五.选择渐 ...

  7. [UE4]蓝图:重写父类时调用父类方法

    右键重写的方法选择“Add call to parent function” 一定要善用这个功能,实现原有父类功能的同时实现子类特别的功能.

  8. postgresql数据库常用操作命令及SQL语言

    (1)登录 peng@peng-virtual-machine:~$ sudo -u postgres psql 以用户postgres身份登录,postgres为用户名,可有多个用户,登录时会要求输 ...

  9. TCP/IP SIGPIPE信号

    往一个已经接受FIN的套接中写是允许的,接受到FIN仅仅代表对方不再发送数据. 在收到RST段之后,如果在调用write就 会产生SIGPIPE信息,对于这个信号的处理我们通常 解决方法 signal ...

  10. mysql下有符号数和无符号数的相关问题

    最近自己的程序在调用mysql的存储过程传参给smallint类型变量的时候,总是出现out of range value的错误,刚开始用C数值转换方式的二进制位转换思路来思考时,总是觉得没什么问题, ...