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

我们使用掩码可以很明确的得出文件的每一种信息。关于掩码,上图中的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. tar -zxvf中的z是个什么鬼

    习惯了tar -czvf和tar -zxvf.今天在本地用压缩软件7z打了一个tar包,在docker容器中用tar -zxvf怎么都解压不了,报错gzip: stdin: not in gzip f ...

  2. docker构建tomcat镜像

    下载centos镜像 # docker pull daocloud.io/centos:7 [root@localhost ~]# docker pull daocloud.io/centos: : ...

  3. [UE4]显示队友

  4. [UE4]RetainerBox,控制UI更新频率,把渲染后的UI当成Texture

    RetainerBox是一个容器,只会影响其容器内的UI,RetainerBox的作用: 一.控制UI更新频率(可能是为有优化性能) 1.在UserWidget中添加Retainer Box容器,并在 ...

  5. hive之权限问题AccessControlException Permission denied: user=root, access=WR

    问题描述:在集群上,用hive分析数据出现如下错误 FAILED: Execution Error, return code from org.apache.hadoop.hive.ql.exec.D ...

  6. 网络编程socket,详细讲述osi七层协议

    一 网络编程 源方: 我们首先来说下数据在两台计算机之间的传递:操作系统控制着除应用层以外的四层 对于用户来说我们发数据一般都是在应用层,也就是我们是直接操作应用软件的,那么应用层要把数据传给传输层就 ...

  7. linux:apt-get 如何安装,查询,解除依赖包

    apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...

  8. python连接数据库——create_engine和conn.cursor

    python操作数据库的方法: 一种是导入sqlalchemy包,另一种是导入psycopg2包. 具体用法如下(此处以postgre数据库举例) 第一种: # 导入包 from sqlalchemy ...

  9. Python 3.6 -win64环境安装PIL模块

    PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修 ...

  10. fabric读书笔记

    chaincode:一种类似于智能合约的代码,通过执行这个代码与账本交互.chaincode存储在节点上 transaction:一次chaincode的运行过程 contract:满足某个条件下,将 ...