在Linux系统下实现Minishell程序流程图
编写一个minishell并支持如下命令:
1.能够显示用户、shell名字及当前工作路径
minishell@zhao:minishell#
2.支持命令输入格式为
command [-options] arg1 arg2 arg3 ...
3.支持的command有如下命令:
ls
ls -a
ls -l
touch
rm
mkdir
rmdir
pwd
cd
cp
mv
ln
ln -s
chmod
cat
exit
ls a.out
ls -l a.out
4.用户输入的命令按照日期时间命令的形式存放在日志文件中记录
1.minishell能够打印命令提示行[用户名@操作系统名:当前路径]
用gwtcpwd获取当前位置绝对路径,获取最后一个路径名打印
2.从终端接收命令
1.gets从stdin接收命令
2.封装添加时间戳函数,将接收到的命令添加时间戳写入日志文件
3.用strtok将命令剪切;根据第一部分判断需要执行的命令
再次剪切并根据第二部分再次判断
.....
4.封装相对应的函数执行相关命令
3.封装执行command命令函数
1.ls
ls
ls -a
ls -l
2.touch
3.rm
4.mkdir
5.rmdir
6.pwd
7.cd
8.cp
9.mv
10.ln
ln
ln -s
11.chmod
12.cat
13.exit
4.返回第一步
C语言源程序如下:
#include "head.h"
char curpath[512];
char curcommand[1024];
/* 显示终端界面 */
void showcommand(void)
{
char *ptmp = NULL;
getcwd(curpath, sizeof(curpath));
ptmp = curpath + strlen(curpath);
while (*ptmp != '/')
{
ptmp--;
}
ptmp++;
printf("minishell@zhao:%s#", ptmp);
fflush(stdout);
return;
}
/* 获得命令 */
void getcommand(void)
{
fgets(curcommand, sizeof(curcommand), stdin);
curcommand[strlen(curcommand)-1] = '\0';
return;
}
void mycd(char *dirname)
{
chdir(dirname);
return;
}
void myls(void)
{
DIR *dp = NULL;
struct dirent *pp = NULL;
dp = opendir(".");
while ((pp = readdir(dp)) != NULL)
{
if ('.' == pp->d_name[0])
{
continue;
}
printf(" %s ", pp->d_name);
}
printf("\n");
closedir(dp);
}
/* 执行命令 */
void docommand(void)
{
char *p = NULL;
p = strtok(curcommand, " ");
if (!strcmp(p, "cd"))
{
p = strtok(NULL, " ");
mycd(p);
}
else if (!strcmp(p, "ls"))
{
if (NULL != (p = strtok(NULL, " ")) && !strcmp(p, "-l"))
{
mylsl();
}
else if (NULL != p && !strcmp(p, "-a"))
{
mylsa();
}
else
{
myls();
}
}
}
int main(int argc, const char *argv[])
{
while (1)
{
showcommand();
getcommand();
docommand();
}
return 0;
} |