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

我们使用掩码可以很明确的得出文件的每一种信息。关于掩码,上图中的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. T-SQL 带参数存储过程

    创建带参数的存储过程 use StudentManager go if exists(select * from sysobjects where name='usp_ScoreQuery4') dr ...

  2. 非mapreduce生成Hfile,然后导入hbase当中

    转自:http://blog.csdn.net/stark_summer/article/details/44174381 未实验 最近一个群友的boss让研究hbase,让hbase的入库速度达到5 ...

  3. Windows使用Idea编译spark源码

    1. 环境准备 JDK1.8 Scala2.11.8 Maven 3.3+ IDEA with scala plugin 2. 下载spark源码 下载地址 https://archive.apach ...

  4. C# DataGridView导出Excel

    using Microsoft.Office.Interop.Excel;                using Excel=Microsoft.Office.Interop.Excel; //这 ...

  5. browserify babel gulp 没有编译import的文件

    1.遇到坑的gulp配置: var gulp = require('gulp'), watch = require('gulp-watch'), babel = require('gulp-babel ...

  6. JVM总结-Java 虚拟机是怎么识别目标方法(下)

    1. 虚方法调用 在上一篇中我曾经提到,Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令.这两种指令, ...

  7. Python之网络编程(Socket)

    1.网络通信原理与互联网协议 详见:https://www.cnblogs.com/JackLi07/p/9218039.html 2.socket层 以上是tcp/ip五层协议的结构图,我们没有看到 ...

  8. python-ddt 数据驱动测试

    # @File : learn_ddt.py #-*- coding:utf-8 -*- #本次学习:ddt ---data drive test--数据驱动测试 #1.安装 pip install ...

  9. webkitAnimationEnd动画事件

    春节终于过完了,自己春节似乎过的有点大,过完春节之后,态度一直没有调整好,总有一股过节的情绪,没有完全进入学习和工作的状态来.继续调整当中…… 这两天项目中遇到一个小需求,十分类似于支付宝蚂蚁森林给小 ...

  10. python对象序列化pickle

    import pickle class A: users = {} c = 1 def get_self(self): return self def n(self): return 1 def pi ...