实现自己的ls命令(上)

本文转自:http://edsionte.com/techblog/archives/661

如果你跟我一样是linux下C编程的初学者,那么动手实现一些linux命令是十分有必要的。本文为你所描述的是常用ls命令。ls命令有众多选项,本文中所描述的my_ls.c程序仅实现了-l和-a选项。
ls命令加入-l选项可以使每个文件单独成一行,并且显示文件的属性。比如:
edsionte@edsionte-laptop:~/code$ ls -l总用量 232-rwxr-xr-x 1 edsionte edsionte 9530 2010-06-18 11:26 error-rw-r–r-- 1 edsionte edsionte 756 2010-06-19 14:39 error.c-rw-r–r-- 1 edsionte edsionte 755 2010-06-18 11:32 error.c~-rw------- 1 edsionte edsionte 0 2010-06-16 12:40 example_62.cls命令加入-a选项可以显示隐藏文件。linux中隐藏文件是以 . 开头的。比如:
edsionte@edsionte-laptop:~/code$ ls -a. example_65.c my_cdvc my_mv… example_68_1.c my_cdvc.c my_mv.c.表示当前目录,…表示当前目录的父目录。
当然这两个选项可以同时使用,比如:
edsionte@edsionte-laptop:~/code$ ls -al总用量 240drwxr-xr-x 3 edsionte edsionte 4096 2010-06-20 12:10 .drwxr-xr-x 46 edsionte edsionte 4096 2010-06-20 12:10 …-rwxr-xr-x 1 edsionte edsionte 9530 2010-06-18 11:26 error-rw-r–r-- 1 edsionte edsionte 756 2010-06-19 14:39 error.c-rw-r–r-- 1 edsionte edsionte 755 2010-06-18 11:32 error.c~-rw------- 1 edsionte edsionte 0 2010-06-16 12:40 example_62.cedsionte@edsionte-laptop:~/code$ ls -l -a总用量 240drwxr-xr-x 3 edsionte edsionte 4096 2010-06-20 12:10 .drwxr-xr-x 46 edsionte edsionte 4096 2010-06-20 12:10 …-rwxr-xr-x 1 edsionte edsionte 9530 2010-06-18 11:26 error-rw-r–r-- 1 edsionte edsionte 756 2010-06-19 14:39 error.c本文所述的my_ls.c程序就要实现这种功能。在了解本程序中所有函数之前,请先看一下本程序的流程图:点这里(本blog上传图片有点问题,正在解决中……)。
现在对本程序中的各个函数做以大致说明。
(1)void my_err(const char*,int,int);和void my_err2(const char*,int);
错误捕获函数。详细实现过程请点这里
(2)void display_dir(int flag_param,charpath);
如果命令中含有目录,则进入此函数。此函数将获取path目录下的文件总数以及所有文件名(包括隐藏文件)。流程图点这里
(3)void display(int flag,char
pathname);
pathname是一个文件的完整路径名,本函数首先从完整的路径名中解析出文件名,再根据flag进入不同的函数。流程图点这里
(4)void display_single(char*);
如果参数中不含任何选项或者仅含-a,则进入此函数。本函数直接显示出目录下的所有文件名,并且实现文件名左对齐。
(5)void display_attribute(struct stat,char*);
如果命令中含有-l则进入本函数,显示出文件的各种属性。
在本文的上班部分中主要为您理清本程序的大体结构,在下半部分中将详细分析源代码。