Linux系统编程入门 | 模拟实现 ls -l 命令

news2024/9/19 14:12:48

模拟实现代码

#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* argv[]) {
    if (argc < 2) {
        printf("%s filename\n", argv[0]);
        return -1;
    }

    struct stat st;
    int sta = stat(argv[1], &st); // 输入的第一个参数就是文件名称,第二个参数为带回结果的结构体
    if (sta == -1) {
        perror("stat");
        return -1;
    }

    char perms[11] = {0}; // 10个字符的字符串

    // 文件类型
    switch(st.st_mode & __S_IFMT) {
        case __S_IFSOCK:
            perms[0] = 's';
            break;
        case __S_IFLNK:
            perms[0] = 'l';
            break;
        case __S_IFREG:
            perms[0] = '-';
            break;
        case __S_IFBLK:
            perms[0] = 'b';
            break;
        case __S_IFDIR:
            perms[0] = 'd';
            break;
        case __S_IFCHR:
            perms[0] = 'c';
            break;
        case __S_IFIFO:
            perms[0] = 'p';
            break;
        default:
            perms[0] = '?';
    }

    // 使用者权限
    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 *uid = getpwuid(st.st_uid)->pw_name;

    // 获取文件所在组
    char *gid = getgrgid(st.st_gid)->gr_name;

    // 获取文件大小(用long int)
    long int size = st.st_size;

    // 获取修改时间
    char *time = ctime(&st.st_mtime); // 传入参数为地址
    // 去掉时间后面的换行符
    char mtime[512] = {0};
    // strlen去掉最后的\0后的长度,注意是strncpy(第三个参数可以指定长度),不是strcpy
    strncpy(mtime, time, strlen(time) - 1); 
    
    char buf[1024];
    sprintf(buf, "%s %d %s %s %ld %s %s", perms, linkNum, uid, gid, size, mtime, argv[1]);

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

    return 0;
}

运行结果
在这里插入图片描述
1、Linux的文件类型
在这里插入图片描述
在这里插入图片描述

  1. 普通文件(Regular File):
    常见的文件类型,用于存储数据
    包括文本文件、二进制文件、脚本文件等
    在文件类型标识中用 - 表示
  2. 目录文件(Directory File):
    包含其他文件和目录的容器,用于组织文件系统的结构
    在文件类型标识中用 d 表示
  3. 符号链接文件(Symbolic Link File,软连接):
    类似于Windows中的快捷方式,指向另一个文件或目录
    在文件类型标识中用 l 表示
  4. 字符设备文件(Character Device File):
    提供对字符流设备的访问,例如键盘、鼠标、串口等
    在文件类型标识中用 c 表示
  5. 块设备文件(Block Device File):
    提供对块设备的访问,例如硬盘、光驱等
    在文件类型标识中用 b 表示
  6. 套接字文件(Socket File):
    用于网络通信的文件类型,允许进程之间的双向通信
    在文件类型标识中用 s 表示
  7. 命名管道文件(Named Pipe, FIFO):
    用于进程间通信,允许一个进程写入数据,另一个进程读取数据
    在文件类型标识中用 p 表示

2、man 命令中不同的数字表示手册页的不同部分:
1:用户命令
2:系统调用
3:库函数
4:设备文件和特殊文件
5:文件格式
6:游戏
7:杂项
8:系统管理命令

3、argv[0] 通常表示的是程序本身的名称

./my_program arg1 arg2

argv[0] = “./my_program”(表示程序的名称或路径)
argv[1] = “arg1”(表示第一个命令行参数)
argv[2] = “arg2”(表示第二个命令行参数)

argv[0] 不一定总是只包含程序的名称,它也可以包含程序的路径,取决于你是如何运行程序的
如果运行命令是 ./my_program,则 argv[0] 可能是 “./my_program”
如果运行命令是 my_program,则 argv[0] 可能是 “my_program”

4、time_t 是C/C++编程语言中用于表示时间的数据类型。它定义在头文件 <time.h> 中(C++中是 <ctime>),通常用于表示从1970年1月1日00:00:00 UTC(即“Unix纪元”)到当前时间的秒数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2146393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sidewalk介绍

目录 1 前言2 简介2.1 注意事项 3 结束语 1 前言 Sidewalk是Amazon出的一个针对IoT物联网的协议&#xff0c;类似于LoRaWAN协议&#xff0c;针对小而美的低功耗设备。Amazon Sidewalk支持低带宽和远程连接&#xff0c;使用BLE进行短距离通信&#xff0c;使用900MHz的频率的LoR…

Selenium实现滑动滑块验证码验证!

背景&#xff1a;在部分的登录中有滑动验证码的验证&#xff0c;由于滑动验证码的缺块是随机的就导致实现起来比较困难&#xff01; 01、实现方案 模板匹配 通过openCV分析两个图片的相似度&#xff0c;获取两个相似度很高图片的坐标&#xff0c;从而计算两个图片的距离。 轮…

(k8s)Kubernetes部署Promehteus

转载&#xff1a;Kubernetes&#xff08;k8s&#xff09;部署Promehteus 一、概述 在1.8版本以后heapster由metrics-server替代&#xff1b;从k8s的v1.11版本开始已经全面转向以Prometheus为核心的新监控体系架构&#xff1b;kube-prometheus 中包含了 prometheus 监控所用到的…

Sui Builder House锦集,原生USDC和CCTP即将登陆Sui

在9月17日新加坡Sui Builder House活动上&#xff0c;我们度过了充满知识分享和社区建设的精彩一天&#xff01;感谢数百位参会的开发者&#xff0c;一同庆祝Sui社区&#xff0c;并了解最新的动态&#xff01; 在过去的24小时内&#xff0c;发布了以下重要消息&#xff0c;不容…

C语言 | Leetcode C语言题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; bool canPartition(int* nums, int numsSize) {if (numsSize < 2) {return false;}int sum 0, maxNum 0;for (int i 0; i < numsSize; i) {sum nums[i];maxNum fmax(maxNum, nums[i]);}if (sum & 1) {return false;}int tar…

网络封装分用

目录 1,交换机 2,IP 3,接口号 4,协议 分层协议的好处: 5,OSI七层网络模型. 6,TCP/IP五层网络模型(主流): [站在发送方视角] [接收方视角] 1,交换机 交换机和IP没有关系,相当于是对路由器接口的扩充,这时相当于主机都与路由器相连处于局域网中,把越来越多的路由器连接起…

月入10000+,蓝海项目!少儿英语赛道

一、项目原理 少儿英语赛道的话&#xff0c;我们主要通过英语小短文&#xff0c;来让孩子学习英语&#xff0c;虽然现在有很多英语的课程&#xff0c;但针对少儿的英语是比较少的&#xff0c;所以这个赛道还是很吃香的。 整体流程也简单&#xff0c;先用AI写出故事&#xff0…

axure的下载,激活,汉化全过程,多图

1.前言 下载地址&#xff1a;https://pan.baidu.com/s/12xo1mJer2hmBK7QrYM5v-Q?pwd0107#list/path%2Fcsdn%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 源文章&#xff1a;https://blog.csdn.net/iwanttostudyc/article/details/123773796?ops_request_misc%257B%2522request%25…

基于SpringBoot+Vue的篮球馆会员信息管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

高中数学:立体几何-平面的定义与公理

文章目录 一、平面定义及画法1、定义2、表示方法 二、公理1、公理12、公理23、公理3 一、平面定义及画法 1、定义 平面是向四周无限延展的。 2、表示方法 我们常用矩形的直观图&#xff0c;即平行四边形表示平面&#xff0e; 我们常用希腊字母α&#xff0c;β&#xff0c…

docker创建rabbitmq容器

创建rabbitmq容器 1.docker导入镜像 2.写docker-compose文件 并创建容器 3.访问15672端口 账号和密码都是guest

资产市场的战争-基于资产的媒体矩阵宣传和IP打造

在资产市场的战争中,基于资产的媒体矩阵宣传和IP打造是提升品牌竞争力、增强市场影响力的重要手段。 不同类型的媒体平台 以下是对这两个方面的详细分析: 一、基于资产的媒体矩阵宣传 1. 媒体矩阵的构建 平台选择:根据资产的特点和目标受众,选择合适的媒体平台进行宣传。…

TMS320F28335的GPIO

1 TMS320F28335 GPIO 介绍 1.1 GPIO 概念 1.2 GPIO 结构框图

neo4j安装为服务+配置环境变量

目录 neo4j安装为服务 windows services 参照JDK&#xff0c;将neo4j加入到环境变量 neo4j安装为服务 windows services 我的上一篇文章详细写明了如何安装启动neo4j《neo4j安装启动教程对应的jdk配置》&#xff0c;文末的启动neo4j是通过cmd命令行访问bin目录&#xff0c;这…

【设计模式-适配】

Adapter Pattern&#xff08;适配器模式&#xff09; 是一种结构型设计模式&#xff0c;其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类&#xff0c;转换一个类的接口&#xff0c;使得原本不兼容的接口可以互相配合&#xff0c;从而实现接口的兼容性…

国庆旅游高峰期,景区如何利用可视化大屏保障游客安全?

国庆假期即将来临&#xff0c;中国文化和旅游部发布的数据显示&#xff0c;今年国庆期间国内旅游市场将迎来爆发式增长&#xff0c;预计出游人次将达到8.96亿&#xff0c;同比增长86%&#xff0c;旅游收入预计将达到7825亿元人民币&#xff0c;同比增长138%。这一繁荣景象无疑给…

使用Apache SeaTunnel高效集成和管理SftpFile数据源

本文为Apache SeaTunnel已经支持的SftpFile Source Connector使用文档&#xff0c;旨在帮助读者理解如何高效地使用SFTP文件源连接器&#xff0c;以便轻松地使用Apache SeaTunnel集成和管理您的SftpFil数据源。 SftpFile 是指通过 SFTP&#xff08;Secure File Transfer Proto…

CC工具箱1.3.6更新_免费_120+工具

CC工具箱1.3.6更新【2024.9.11】 使用环境要求&#xff1a;ArcGIS Pro 3.0 一、下载链接 https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下载链接中下载安装文件【CC工具箱1.3.6.esriAddinX】&#xff0c;直接点击安装即可。 2、安装好后打…

诸葛智能助力唐山银行、三峡媒体斩获「数智卓越企业」大奖

近日&#xff0c;2024爱分析第六届数据智能高峰论坛在北京成功举办&#xff0c;旨在深入探讨AI大模型与数据要素在企业智能化转型中的重要作用&#xff0c;分享前沿技术成果与头部企业实践经验。 诸葛智能作为数智化转型的优秀厂商&#xff0c;携手同样走在行业转型前沿的先锋…

网络爬虫的最佳实践:结合 set_time_limit() 与 setTrafficLimit() 抓取云盘数据

在数据爬取领域&#xff0c;百度云盘作为国内领先的云存储服务平台&#xff0c;拥有海量的用户和数据资源。因此&#xff0c;对于技术开发者而言&#xff0c;如何高效、稳定地对百度云盘中的公开资源进行数据抓取成为了一个值得探讨的课题。本文将结合 PHP 的 set_time_limit()…