共分为四个部分
1、主函数
2、终端函数
3、指令函数
4、头文件,函数声明
1、主函数(man.c)
#include "head.h"
#include "terminal.h"
#include "commond.h"
int main(void)
{
char commandbuf[1024] = {0};
char *parg[10] = {NULL};
int curcnt = 0;
while (1)
{
/*显示终端*/
ShowCommand();
/*获得命令*/
GetCommand(commandbuf, sizeof(commandbuf));
/*记录命令*/
RecordCommand(commandbuf);
/*分割命令*/
curcnt = SpiltCommand(commandbuf, parg, 10);
/*执行命令*/
DoCommand(parg, curcnt);
}
}
2、终端显示函数(terminal.c)
#include "head.h"
#include "commond.h"
/*显示终端*/
int ShowCommand(void)
{
char curpath[4096] = {0};
char *pret = NULL;
char *ptmp = NULL;
pret = getcwd(curpath, sizeof(curpath));
if (NULL == pret)
{
return -1;
}
ptmp = curpath + strlen(curpath);
while (*ptmp != '/')
{
ptmp--;
}
if (0 != strcmp(curpath, "/"))
{
ptmp++;
}
printf("linux@ubuntu:%s#", ptmp);
//fflush(stdout);
return 0;
}
/*获得命令*/
int GetCommand(char *pcommand, int maxlen)
{
fgets(pcommand, maxlen, stdin);
pcommand[strlen(pcommand)-1] = '\0';
return 0;
}
/*分割命令*/
int SpiltCommand(char *pcmd, char **pparg, int argmaxlen)
{
int cnt = 0;
pparg[cnt] = strtok(pcmd, " ");
if (NULL == pparg[cnt])
{
return cnt;
}
cnt++;
while (cnt < argmaxlen)
{
pparg[cnt] = strtok(NULL, " ");
if (NULL == pparg[cnt])
{
return cnt;
}
cnt++;
}
return cnt;
}
/*执行命令*/
int DoCommand(char **pparg, int curcnt)
{
if (0 == curcnt)
{
return 0;
}
if (0 == strcmp(pparg[0], "cd"))
{
MyCd(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "ls"))
{
MyLs(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "touch"))
{
MyTouch(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "history"))
{
MyHistory(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "chmod"))
{
MyChmod(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "find"))
{
MyFind(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "cp"))
{
MyCopy(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "mkdir"))
{
MyMakedir(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "rmdir"))
{
MyRmdir(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "cat"))
{
MyCat(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "mv"))
{
MyMove(pparg, curcnt);
}
else if (0 == strcmp(pparg[0], "exit"))
{
exit(0);
}
return 0;
}
/*记录命令*/
int RecordCommand(char *pcmd)
{
FILE *fp = NULL;
time_t t;
struct tm *ptm = NULL;
fp = fopen("/home/linux/history.txt", "a");
if (fp == NULL)
{
return -1;
}
time(&t);
ptm = localtime(&t);
fprintf(fp, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, pcmd);
fclose(fp);
return 0;
}
3、指令函数(command.c)
#include "head.h"
static int DisplayFiles(const char *pfilename);
static int ListDir(char *pdirname, char *pfilename);
static int PrintfFiles(char *pfilename);
static int CopyEveryThing(const char *dstfile, const char *srcfile);
/*查看文件详细信息*/
int DisplayFiles(const char *pfilename)
{
struct stat buf;
struct passwd *pwd = NULL;
struct group *grp = NULL;
struct tm *ptm = NULL;
int ret = 0;
char *pmon[12] = {"Jan", "Feb", "Mar", "Apri", "May", "Jun", "Jul", "Aug", "Stb", "Oct", "Nov", "Dec"};
ret = lstat(pfilename, &buf);
if (-1 == ret)
{
return -1;
}
if (S_ISREG(buf.st_mode))
{
printf("-");
}
else if (S_ISDIR(buf.st_mode))
{
printf("d");
}
else if (S_ISFIFO(buf.st_mode))
{
printf("p");
}
else if (S_ISLNK(buf.st_mode))
{
printf("l");
}
else if (S_ISSOCK(buf.st_mode))
{
printf("s");
}
else if (S_ISBLK(buf.st_mode))
{
printf("b");
}
else if (S_ISCHR(buf.st_mode))
{
printf("c");
}
buf.st_mode & S_IRUSR ? putchar('r') : putchar('-');
buf.st_mode & S_IWUSR ? putchar('w') : putchar('-');
buf.st_mode & S_IXUSR ? putchar('x') : putchar('-');
buf.st_mode & S_IRGRP ? putchar('r') : putchar('-');
buf.st_mode & S_IWGRP ? putchar('w') : putchar('-');
buf.st_mode & S_IXGRP ? putchar('w') : putchar('-');
buf.st_mode & S_IROTH ? putchar('w') : putchar('-');
buf.st_mode & S_IWOTH ? putchar('w') : putchar('-');
buf.st_mode & S_IXOTH ? putchar('w') : putchar('-');
printf(" %-2ld", buf.st_nlink);
pwd = getpwuid(buf.st_uid);
printf(" %-s", pwd->pw_name);
grp = getgrgid(buf.st_gid);
printf(" %-s", grp->gr_name);
printf(" %-6ld", buf.st_size);
ptm = localtime(&buf.st_mtime);
printf(" %-s %-2d %-2d:%-2d", pmon[ptm->tm_mon], ptm->tm_mday, ptm->tm_hour, ptm->tm_min);
printf(" %-s\n", pfilename);
return 0;
}
/*查看当前目录所有文件 ls*/
int MyLs(char **pparg, int arglen)
{
DIR *dp = NULL;
struct dirent *pp = NULL;
dp = opendir(".");
if (dp == NULL)
{
return -1;
}
while (1)
{
pp = readdir(dp);
if (NULL == pp)
{
break;
}
if ('.' == *pp->d_name && (2 == arglen && 0 == strcmp(pparg[1], "-a")))
{
continue;
}
if (2 == arglen && 0 == strcmp(pparg[1], "-l"))
{
DisplayFiles(pp->d_name);
}
else
{
printf("%s ", pp->d_name);
}
}
if (!(2 == arglen && 0 == strcmp(pparg[1], "-l")))
{
printf("\n");
}
closedir(dp);
return 0;
}
/*切换文件cd*/
int MyCd(char **pparg, int arglen)
{
if (arglen == 2)
{
chdir(pparg[1]);
}
return 0;
}
/*创建普通文件*/
int MyTouch(char **pparg, int arglen)
{
if (arglen == 2)
{
fclose(fopen(pparg[1], "w"));
}
return 0;
}
/*显示历史命令*/
int MyHistory(char **parg, int arglen)
{
FILE *fp = NULL;
char *pret = NULL;
char tempbuff[4096] = {0};
fp = fopen("/home/linux/history.txt", "r");
if (fp == NULL)
{
return -1;
}
while (1)
{
pret = fgets(tempbuff, sizeof(tempbuff), fp);
if (pret == NULL)
{
break;
}
printf("%s", tempbuff);
}
fclose(fp);
}
/*修改文件权限*/
int MyChmod(char **pparg, int arglen)
{
char *ptemp = NULL;
int val = 0;
int ret = 0;
if (3 != arglen)
{
return -1;
}
ptemp = pparg[1];
while (*ptemp != '\0')
{
val = val * 8 + (*ptemp - '0');
ptemp++;
}
ret = chmod(pparg[2], val);
if (-1 == ret)
{
return -1;
}
return 0;
}
/*遍历文件*/
int ListDir(char *pdirname, char *pfilename)
{
DIR *dp = NULL;
struct dirent *pp = NULL;
char filepath[1024] = {0};
dp = opendir(pdirname);
if (dp == NULL)
{
return -1;
}
while (1)
{
pp = readdir(dp);
if (pp == NULL)
{
break;
}
if (*pp->d_name == '.')
{
continue;
}
sprintf(filepath, "%s/%s", pdirname, pp->d_name);
if (0 == strcmp(pp->d_name, pfilename))
{
printf("%s\n", filepath);
}
if (DT_DIR == pp->d_type)
{
ListDir(filepath, pfilename);
}
}
closedir(dp);
return 0;
}
/*查找文件*/
int MyFind(char **pparg, int arglen)
{
int ret = 0;
if (4 != arglen)
{
return -1;
}
ret = ListDir(pparg[1], pparg[3]);
if (-1 == ret)
{
return -1;
}
return 0;
}
/*复制过程*/
int CopyEveryThing(const char *dstfile, const char *srcfile)
{
FILE *dst = NULL;
FILE *src = NULL;
size_t ret = 0;
char tempbuff[4096] = {0};
dst = fopen(dstfile, "w");
if (dst == NULL)
{
goto err2;
}
src = fopen(srcfile, "r");
if (src == NULL)
{
goto err1;
}
while (1)
{
ret = fread(tempbuff, 1, sizeof(tempbuff), src);
if (0 == ret)
{
break;
}
fwrite(tempbuff, 1, sizeof(tempbuff), dst);
}
fclose(dst);
fclose(src);
return 0;
err1:
fclose(dst);
err2:
return -1;
}
/*复制文件*/
int MyCopy(char **pparg, int arglen)
{
int ret = 0;
if (3 != arglen)
{
return -1;
}
ret = CopyEveryThing(pparg[2], pparg[1]);
if (-1 == ret)
{
return -1;
}
return 0;
}
/*创建文件夹*/
int MyMakedir(char **pparg, int arglen)
{
if (arglen == 2)
{
mkdir(pparg[1], 0664);
}
return 0;
}
/*删除文件夹*/
int MyRmdir(char **pparg, int arglen)
{
if (arglen == 2)
{
rmdir(pparg[1]);
}
return 0;
}
/*剪切、移动、重命名文件*/
int MyMove(char **pparg, int arglen)
{
int ret = 0;
if (3 != arglen)
{
return -1;
}
ret = MyCopy(pparg, arglen);
if (-1 == ret)
{
return -1;
}
ret = MyRmdir(pparg, arglen);
if (-1 == ret)
{
return -1;
}
return 0;
}
/*打印文件内容*/
int PrintfFiles(char *pfilename)
{
FILE *fp = NULL;
char *pret = NULL;
char temp[4096] = {0};
fp = fopen(pfilename, "r");
if (fp == NULL)
{
perror("Open Failed");
return -1;
}
while (1)
{
pret = fgets(temp, sizeof(temp), fp);
if (pret == NULL)
{
break;
}
printf("%s", temp);
}
fclose(fp);
return 0;
}
/*查看文件内容*/
int MyCat(char **pparg, int arglen)
{
if (2 == arglen)
{
PrintfFiles(pparg[1]);
}
return 0;
}
4、声明
1、head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <grp.h>
#include <pwd.h>
#endif
2、terminal.h
#ifndef __TERMINAL_H__
#define __TERMINAL_H__
extern int ShowCommand(void);
extern int GetCommand(char *pcommand, int maxlen);
extern int SpiltCommand(char *pcmd, char **pparg, int argmaxlen);
extern int DoCommand(char **pparg, int curcnt);
extern int RecordCommand(char *pcmd);
#endif
3、command.h
#ifndef __COMMAND_H__
#define __COMMAND_H__
extern int MyLs(char **pparg, int arglen);
extern int MyCd(char **pparg, int arglen);
extern int MyTouch(char **pparg, int arglen);
extern int MyHistory(char **parg, int arglen);
extern int MyChmod(char **pparg, int arglen);
extern int MyFind(char **pparg, int arglen);
extern int MyCopy(char **pparg, int arglen);
extern int MyMakedir(char **pparg, int arglen);
extern int MyRmdir(char **pparg, int arglen);
extern int MyMove(char **pparg, int arglen);
extern int MyCat(char **pparg, int arglen);
#endif