当前位置: 首页 > article >正文

用C语言打造自己的Unix风格ls命令

在Unix或类Unix操作系统中,ls是一个非常基础且实用的命令,它用于列出当前目录或指定目录下的文件和子目录。下面,我们将通过C语言编写一个简化的ls命令,展示如何利用dirent.h头文件提供的函数接口实现这一功能。

#include "apue.h"
#include <dirent.h>

int main(int argc, char *argv[]) {
    DIR *dp; // 定义指向目录流的指针
    struct dirent *dirp; // 定义指向dirent结构体的指针

    // 检查参数个数,确保传入了一个目录名
    if (argc != 2)
        err_quit("Usage: custom_ls directory"); // 使用err_quit宏输出错误信息并退出

    // 尝试打开指定的目录
    if ((dp = opendir(argv[1])) == NULL)
        err_sys("cannot open %s", argv[1]); // 使用err_sys宏输出错误信息并退出

    // 遍历目录流,直到读取结束
    while ((dirp = readdir(dp)) != NULL) {
        // 输出目录条目的文件名
        printf("%s\n", dirp->d_name);
    }

    // 关闭目录流
    closedir(dp);

    // 程序正常执行完毕,退出
    exit(0);
}

```

假设我们已经编译并运行了上述代码,在命令行中可以看到如下交互过程:

root@minos-virtual-machine:~/CLionProjects/unixdemo001# gcc main.c
root@minos-virtual-machine:~/CLionProjects/unixdemo001# ls
a.out  cmake-build-debug  CMakeLists.txt  main.c
root@minos-virtual-machine:~/CLionProjects/unixdemo001# ./a.out ./
a.out
main.c
CMakeLists.txt
.
cmake-build-debug
..
root@minos-virtual-machine:~/CLionProjects/unixdemo001#

通过这段简单的C代码,我们创建了一个能列出指定目录下所有文件和子目录的基本程序。这里apue.h包含了对系统调用和错误处理的一些封装,简化了程序开发。在循环体内,readdir()函数逐个读取目录条目,并通过dirp->d_name获取文件或目录名,将其打印出来。

需要注意的是,此自定义ls命令的功能相比原生ls命令更为简单,未包含诸如排序、权限显示、隐藏文件过滤等额外功能。在实际应用中,若要完全替代ls命令,还需增加更多细节处理。


http://www.kler.cn/a/274797.html

相关文章:

  • Vue.js 如何选择合适的组件库
  • Shell基础:中括号的使用
  • 安全策略实验报告
  • 深度学习 Pytorch 基础网络手动搭建与快速实现
  • 编程AI深度实战:给vim装上AI
  • C# 精炼题18道题(类,三木运算,Switch,计算器)
  • 五、C#归并排序算法
  • MaixSense-A010 接入 ROS
  • 信息学奥赛之C++中的数据类型数据结构
  • 简介:iframe 沙箱+WebComponent 容器
  • 网络安全的几个关键领域
  • 深入理解栈和队列(一):栈
  • 鸿蒙原生应用开发-ArkTS语言基础类库多线程CPU密集型任务TaskPool
  • 多线程:线程池
  • C语言经典面试题目(十六)
  • 选数异或 (AcWing 4645)
  • 设计模式学习笔记 - 规范与重构 - 8.实践:程序出错返回啥?NULL、异常、错误吗、空对象?重构ID生成器,处理各函数的异常
  • 国内外15款AI搜索引擎汇总
  • 选择排序算法(Selection Sort)原理及实现
  • 基于Spring Boot+Vue的智慧图书管理系统
  • 【使用xlrd、xlutils读写excel】
  • Devops-01-devops 是什么?
  • 自动化单元测试 Automatic Test Generation
  • 漫谈微服务网关
  • 性能优化(CPU优化技术)-NEON指令详解
  • 服务器版本命令查看