1.shell :命令解释器--外置命令
知识点:*命令有三类:外置命令、内置命令(cd)、别名
*getcwd()获得当前工作目录
chdir()改变当前工作路径
2.封装函数
1.输出命令提示
2.获取终端用户输入命令
3.解析用户命令
4.执行用户命令
5.退出当前exit
二、代码
.h
#ifndef __TERMINAL_H__
#define __TERMINAL_H__
#define CMD_MAX_LEN 512
#define CMD_MAX_CNT 10
extern void show_usr_cmd_line();
extern int get_usr_cmd(char *buff, int max_len);
extern int parse_usr_cmd(char *cmd_buff, char *arg[]);
extern void exec_usr_cmd(char *arg[], int cmd_cnt);
#endif
.c
#include "terminal.h"
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
void show_usr_cmd_line()
{
char buff[512] = {0};
char path[128] = {0};
getcwd(path, sizeof(path));
sprintf(buff, "XXX@ubuntu:%s$ ", path);
printf("%s", buff);
return;
}
int get_usr_cmd(char *buff, int max_len)
{
fgets(buff, max_len, stdin);
buff[strlen(buff) -1] = '\0';
// printf("buff = %s\n", buff);
return 0;
}
int parse_usr_cmd(char *cmd_buff, char *arg[])
{
int i = 0;
arg[i] = strtok(cmd_buff, " ");
while (arg[i] != NULL)
{
i++;
arg[i] = strtok(NULL, " ");
}
return i;
}
void exec_usr_cmd(char *arg[], int cmd_cnt)
{
pid_t pid = fork();
if (pid > 0)
{
wait(NULL);
}
else if (0 == pid)
{
execvp(arg[0], arg);
printf("fail exec\n");
}
else
{
printf("fail fork\n");
}
}
main.c
#include <stdio.h>
#include "terminal.h"
#include <string.h>
int main(int argc, const char *argv[])
{
char cmd_buff[CMD_MAX_LEN] = {0};
char *arg[CMD_MAX_CNT] = {NULL};
int cmd_cnt = 0;
while (1)
{
show_usr_cmd_line();
get_usr_cmd(cmd_buff, CMD_MAX_LEN);
cmd_cnt = parse_usr_cmd(cmd_buff, arg);
if (!strcmp(arg[0], "exit"))
{
break;
}
else if (!strcmp(arg[0], "cd"))
{
//cd /
chdir(arg[1]);
continue;
}
exec_usr_cmd(arg, cmd_cnt);
}
return 0;
}
二、效果