一、思维导图
二、使用多进程 + wait + exec + strtok 实现一个伪装的终端
#include <myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//读取一行,并去掉末尾的换行符
char *getLine(char *buf, int size)
{
fgets(buf, size, stdin);
int len = strlen(buf);
if(buf[len - 1] == 10){
buf[len - 1] = 0;
}
}
int main(int argc, const char *argv[])
{
while(1){
int res = fork();
if(res > 0){
wait(0);
}else if(res == 0){
// 子进程部分,输入shell指令并替换成该shell指令进行运行
char hostname[32] = {0}; //存放主机名
char cwd[128] = {0}; //存放路径名
char cmd[128] = {0}; //存放输入的终端指令
char *username = getlogin(); //获取用户名
gethostname(hostname, 32); //获取主机名
getcwd(cwd, 128); //获取路径
printf("\033[1;32;10m%s@%s\033[0m:\033[1;34;10m%s\033[0m$ ", username, hostname, cwd);
fflush(stdout);
getLine(cmd, 128); //读取一行,并去掉末尾的换行符
char *arg[20] = {0};
int i = 0;
char *res = 0;
while(1){
if(res == 0){
res = strtok(cmd, " "); //第一次分割
}else{
res = strtok(NULL, " "); // NULL 分割剩下的字符串
}
if(res == 0){break;}
arg[i++] = res;
}
/*
for(int j=0; j<i; j++){
printf("%s ", arg[j]);
fflush(stdout);
}
printf("\n");
*/
if(strcmp("cd", arg[0]) == 0){
chdir(arg[1]); //cd指令
}else{
execvp(arg[0], arg); //替换指令
}
printf("%s:未找到命令\n", arg[0]); //如果execvp返回,说明执行失败
}else{
perror("fork");
return 1;
}
}
return 0;
}