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