如果你跟我一样是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.c
ls命令加入-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 总用量 240 drwxr-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.c edsionte@edsionte-laptop:~/code$ ls -l -a 总用量 240 drwxr-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,char*path);
如果命令中含有目录,则进入此函数。此函数将获取path目录下的文件总数以及所有文件名(包括隐藏文件)。流程图点这里。
(3)void display(int flag,char*pathname);
pathname是一个文件的完整路径名,本函数首先从完整的路径名中解析出文件名,再根据flag进入不同的函数。流程图点这里。
(4)void display_single(char*);
如果参数中不含任何选项或者仅含-a,则进入此函数。本函数直接显示出目录下的所有文件名,并且实现文件名左对齐。
(5)void display_attribute(struct stat,char*);
如果命令中含有-l则进入本函数,显示出文件的各种属性。
在本文的上班部分中主要为您理清本程序的大体结构,在下半部分中将详细分析源代码。