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

简介: 用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命令,还需增加更多细节处理。

相关文章
|
4月前
|
存储 Shell Linux
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
53 0
|
12天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
17天前
|
Shell Linux API
C语言在linux环境下执行终端命令
本文介绍了在Linux环境下使用C语言执行终端命令的方法。首先,文章描述了`system()`函数,其可以直接执行shell命令并返回结果。接着介绍了更强大的`popen()`函数,它允许程序与命令行命令交互,并详细说明了如何使用此函数及其配套的`pclose()`函数。此外,还讲解了`fork()`和`exec`系列函数,前者创建新进程,后者替换当前进程执行文件。最后,对比了`system()`与`exec`系列函数的区别,并针对不同场景推荐了合适的函数选择。
|
1月前
|
Unix 数据处理 Perl
|
4月前
|
Unix Shell Linux
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
70 4
|
3月前
|
监控 Unix 程序员
Python 实现 Unix 'tail' 命令的完整解决方案
这是一个关于Python实现的 tail 命令库的摘要,最初由一个斯里兰卡程序员编写。代码中存在一个问题,在获取文件大小时可能抛出文件不存在的异常,已修复此 bug,添加了错误处理。修复后的代码包含一个名为 `wait_file_get_size` 的函数,用于安全地获取文件大小。此外,提供了类 `Tail`,用于监视文件变化,并可注册回调函数处理新行。
|
4月前
|
安全 Unix Linux
【专栏】`rmdir`命令在Linux和类Unix系统中用于删除空目录,不适用于非空目录
【4月更文挑战第28天】`rmdir`命令在Linux和类Unix系统中用于删除空目录,不适用于非空目录。基本语法为`rmdir [options] directory...`,常用选项包括`-p`(递归删除空父目录)和`--ignore-fail-on-non-empty`(忽略非空目录错误)。与`rm -r`相比,`rmdir`更安全,适用于知道目录为空的情况。在自动化脚本和清理构建目录等场景中,`rmdir`能有效管理空目录。使用时确保目录为空,避免误删,必要时结合`ls`和`sudo`检查或提升权限。
54 1
|
4月前
|
小程序 Linux API
Linux用C语言模拟‘ls‘命令
Linux用C语言模拟‘ls‘命令
33 1
|
4月前
|
前端开发 Unix Linux
Linux indent命令 (格式化C语言源代码的程序)
Linux indent命令 (格式化C语言源代码的程序)
41 0
Linux indent命令 (格式化C语言源代码的程序)
|
4月前
|
C语言 索引
基于C语言的函数指针应用-消息命令处理框架
基于C语言的函数指针应用-消息命令处理框架
29 0