Linux C编程my_ls 的实现(仅供参考)
功能
-
参数: -a -l -R -t -r -i -s
-
-R需要实现对根目录的查询
-
需要实现各种参数的随意组合
-
在所有目录下都可使用自己的my_ls
-
界面美观( 输出对齐等)
-
能屏蔽Ctrl+c杀死程序
-
按照文件类型以及权限的不同分颜色输出
流程图
完整代码
- 代码有一些问题,当Rs组合时会出错,a与s和其他参数组合会没有.和 . .
参数输入及处理
我们在终端使用ls时是以下格式:
ls
ls -a
ls -aR
…
我们自己写的my_ls.c可以用以下格式:
ycl@ycl-PC:~/Desktop/Linux文件$ gcc my_ls.c -o my_ls
ycl@ycl-PC:~/Desktop/Linux文件$ ./my_ls
ycl@ycl-PC:~/Desktop/Linux文件$ ./my_ls -a
ycl@ycl-PC:~/Desktop/Linux文件$ ./my_ls -aR
......
参数如何在./my_ls时传入函数
主函数main有两个参数,函数原型如下
int main(int argc, char * argv[]);
char *argv[]表示一个每一个元素都是一个char *型的指针,平时我们使用main函数时并为使用这两个参数,但argc在没有输入参数时为1,argv[0]指向的字符串为运行程序的文件名,例如:
test.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("my_ls.c的讲解");
return 0;
}
这个程序的argc为1,*argv[0]为test.c
当有参数输入时,就以my_ls.c为例子:
./my_ls -a时
argc = 2
*argv[0] = "my_ls.c"
*argv[1] = "-a"
./my_ls -a -R时
argc = 3
*argv[0] = "my_ls.c"
*argv[1] = "-a"
*argv[2] = "-R"
这样就将参数储存到了argv和argc中
参数的处理
参数虽然传入到了函数中但以字符串的形式并不好使用,在my_ls.c中我们将字符串转化为数字,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <linux/limits.h>
#include <dirent.h>
#include <grp.h>
#include <pwd.h>
#include <errno.h>
#include <signal.h>
#define PARAM_NONE 0
#define PARAM_A 1 //参数a
#define PARAM_L 2 //参数l
#define PARAM_I 4 //参数i
#define PARAM_R 8 //参数r
#define PARAM_T 16 //参数t
#define PARAM_RR 32 //参数R
#define PARAM_S 64 //参数s
#define MAXROWLEN 155 //每行所用最大格数
int main(int argc, char *argv[])
{
int i, j, k, num;
char path[PATH_MAX+1];
char param[32];
int flag_param = PARAM_NONE;
struct stat buf;
j = 0;
num = 0;
signal(SIGINT, sighandler);
//将参数提取到数组param中
for(i = 1;i<argc;i++)
{
if(argv[i][0] == '-')
{
for(k = 1;k<strlen(argv[i]);j++,k++)
{
param[j] = argv[i][k];
}
num++;
}
}
//将参数变形以数字形式保存进flag_param
for(i = 0;i < j;i++)
{
if(param[i] == 'a')
{
flag_param |= PARAM_A;
}
else if(param[i] == 'l')
{
flag_param |= PARAM_L;
}
else if(param[i] == 'R')
{
flag_param |= PARAM_RR;
}
else if(param[i] == 'r')
{
flag_param |= PARAM_R;
}
else if(param[i] == 't')
{
flag_param |= PARAM_T;
}
else if(param[i] == 'i')
{
flag_param |= PARAM_I;
}
else if(param[i] == 's')
{
flag_param |= PARAM_S;
}
else
{
printf("ls:不适用的选项 -- %c", param[i]);
exit(1);
}
}
//判断是否有目录输入,没有则打开根目录./
if(num + 1 == argc)
{
strcpy(path,"./");
path[2] = '\0';
display_dir(flag_param,path);
return 0;