题目
实现一个终端的功能,注意需要带有cd功能
思路
如何 C语言执行shell命令? 使用进程替换exec函数;;使用system函数。
如何 切换工作目录? 使用chdir函数切换工作目录。
其他方面
将工作目录中 /home/ubuntu 替换为 ~
将终端输入的 ~ 替换为 /home/ubuntu
代码
void task2(void); //子进程任务函数
void beautify(); //显示美化int main(int argc, const char *argv[])
{pid_t pid; //进程pid,用于区分父子进程while(1){pid=fork(); //创建子进程if(pid>0){wait(0);} //回收子进程if(pid==0){break;} //子进程,跳出}//子进程任务if(pid==0){while(1){task2(); //进程替换之后,程序结束,父进程回收}}return 0;
}void beautify()
{char*username=getlogin(); //用户名char hostname[64]={0};gethostname(hostname,63); //主机名char cwd[64]={0};getcwd(cwd,63); //当前路径//截取,将 /home/ubuntu 替换为 ~if(!strncmp(cwd,"/home/ubuntu",12)){cwd[0]='~'; //将/home/ubuntu 替换为 ~int len=strlen(cwd); //获取路径名长度,返回'\0'之前长度int i;for(i=0;i<len-11;i++){cwd[i+1]=cwd[i+12]; //向前搬运}}//显示路径printf("\033[1;32;10m%s@%s\033[0m:\033[1;34;10m%s\033[0m$ ",username,hostname,cwd);
}void task2(void)
{// printf("请输入终端命令:");beautify();//获取终端输入内容char shell[128]="";fgets(shell,128,stdin);//剔除'\n'int len=strlen(shell); //字符串长度 '\0'之前的长度 下标len内容为'\0'if(shell[len-1]=='\n') //下标len-1为 '\n'{shell[len-1]='\0'; //替换为'\0'}//截取字符串,拆分出 终端输入的shell命令, 放入cmd[?]数组中char *res=NULL;char *cmd[25]={NULL}; //用于存放拆分出的命令for(int i=0;;i++){if(NULL==res){res=strtok(shell," "); //以" "为分隔符进行拆分,返回拆分后的字符串的首地址}else{res=strtok(NULL," "); //以" "为分隔符进行拆分,返回拆分后的字符串的首地址}if(NULL==res){break;} //当返回值为NULL时,说明分割完毕,退出cmd[i]=res;}//进程替换if(!strcmp(cmd[0],"cd")){//恢复,将 ~ 替换为 /home/ubuntuif(!strncmp(cmd[1],"~",1)){int len=strlen(cmd[1]); //获取原字符串长度char cwd[64]={0}; //用于存放工作路径strcpy(cwd,cmd[1]); //复制字符串到字符数组for(int i=0;i<len;i++){cwd[len+12-i]=cwd[len-i]; //腾位,从后向前,每个都向后搬运12字节strncpy(cwd,"/home/ubuntu",12); //将 ~ 转为 /home/ubuntuchdir(cwd); //更改工作目录,注意,进程替换后,新创建的进程 工作目录与父进程相同 }return;}}chdir(cmd[1]); //更改工作目录,注意,进程替换后,新创建的进程 工作目录与父进程相同return;}execvp(cmd[0],cmd);perror("REEROR:进程替换失败\n");}
效果