首页 > 系统相关 >Linux系统编程10-模拟实现 ls -l 命令

Linux系统编程10-模拟实现 ls -l 命令

时间:2022-10-14 22:24:30浏览次数:39  
标签:case 10 perms st break mode Linux include ls

//-rw-rw-r-- 1 username groupname 112 Wed Sep 14 22:08:30 2022 hello.txt

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    //判断输入的参数是否正确
    if (argc < 2)
    {
        printf("%s filename\n", argv[0]);
        return -1;
    }

    //通过stat函数获取用户传入的文件信息
    struct stat st;
    int ret = stat(argv[1], &st);
    if (ret == -1)
    {
        perror("stat err");
        return -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 *fileGroup = getgrgid(st.st_gid)->gr_name;

    //文件大小
    long int fileSize = st.st_size;

    //获取修改时间
    char *time = ctime(&st.st_mtime);
    char mtime[512];
    strncpy(mtime, time, strlen(time) - 1);

    char buf[1024];
    sprintf(buf, "%s %d %s %s %ld %s %s", perms, linkNum, fileUser, fileGroup, fileSize, mtime, argv[1]);
    printf("%s\n", buf);

    return 0;
}

标签:case,10,perms,st,break,mode,Linux,include,ls
From: https://www.cnblogs.com/anqwjoe/p/16793194.html

相关文章

  • Linux系统编程12-chmod
    #include<sys/stat.h>intchmod(constchar*pathname,mode_tmode);修改文件的权限参数:-pathname:需要修改文件的路径-mode:需要修......
  • Linux系统编程13-truncate.md
    #include<unistd.h>#include<sys/types.h>inttruncate(constchar*path,off_tlength);作用:缩减或扩展文件尺寸至指定的大小,长的截断,短的扩展参数:......
  • Linux系统编程15-chdir与getcwd
    #include<unistd.h>intchdir(constchar*path);作用:修改进程的工作目录比如在/home/nowcoder启动了一个可执行程序a.out,进程的工作目录就是......
  • Linux系统编程14-rename
    #include<stdio.h>intrename(constchar*oldpath,constchar*newpath);作用:重命名文件或文件夹返回值:执行成功则返回0,失败返回-1,错误原因存于errno实例:重命名目......
  • Linux系统编程16-mkdir与rmdir
    #include<sys/stat.h>#include<sys/types.h>intmkdir(constchar*pathname,mode_tmode);作用:创建一个目录参数:pathname:创建的目录的路径......
  • Linux系统编程17-opendir,readdir与closedir.md
    #include<sys/types.h>#include<dirent.h>DIR*opendir(constchar*name);作用:打开一个目录参数:-name:需要打开的目录流返回值:......
  • Linux系统编程18-dup和dup2.md
    dup#include<unistd.h>intdup(intoldfd);作用:复制一个新的文件描述符,指向同一个文件, 从空闲的文件描述符表中找一个最小的作为新文件描述符参数:......
  • 关于ansible-通过Ad-hoc和playbook-对linux主机的连接性测试
    环境:被控主机都是linux主机,不过好几种发行版本,但是笔者都还是设计了统一的标准1、主控和被控端都是Linux操作系统,都是有ansible用户的2、主控通过ssh-key的私钥登录到被......
  • Linux系统编程01-GCC
    GCCGCC(GNUCompilerCollection)GNU编译器套件,支持C的"方言",可用命令行选项来控制编译器在翻译源代码时应该遵循哪个C标准。当使用命令行参数-std=c99启动GCC......
  • Linux系统编程03-动态库
    动态库制作命名规则Linux:libxxx.solib:前缀xxx:库的名字.so:后缀Windows:libxxx.dll制作:gcc生成.o文件,得到和位置无关的代码gcc-c-fpic/f......