C++如何实现模拟shell命令行
导读:本文共2354.5字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、解析/***进行命令行解析:*多个空格*分割符:<>|**/voidparse(){std::stringline;getline(std::cin,line);/**解析字符串*/intlen=line.size(),i=0;std::stringtmp;std::vector<std::string>tmp... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。一、解析
/***进行命令行解析:*多个空格*分割符:<>|**/voidparse(){std::stringline;getline(std::cin,line);/**解析字符串*/intlen=line.size(),i=0;std::stringtmp;std::vector<std::string>tmp_vc;while(i<line.size()){if(line[i]==''){i++;continue;}if(line[i]=='|'){vc.push_back(tmp_vc);tmp="";i++;continue;}intpos=line.find('',i);//获取下一个空格的位置tmp=line.substr(i,pos-i);//截取字符串tmp_vc.push_back(tmp);i=pos;}vc.push_back(tmp_vc);}
二、执行命令函数
/**执行命令子函数*/voidfunc(std::vector<std::string>&v){char*arr[10];pid_tpid;pid=fork();if(pid==-1){std::cout<<"forkerror"<<std::endl;exit(1);}elseif(pid==0){for(inti=0;i<v.size();++i)arr[i]=(char*)v[i].c_str();arr[v.size()]=NULL;execvp(arr[0],arr);}else{wait(NULL);}}/**执行命令*--------*创建子进程执行*当出现|需要创建多个子进程*当出现><则将内容写入文件或者命令行**/voidexecCommnd(){for(inti=0;i<vc.size();++i){func(vc[i]);}}
三、模拟shell
/**获取当前所在目录*/voidgetCurPwd(){std::strings=get_current_dir_name();intpos=s.rfind('/');std::stringtmp=s.substr(pos+1,s.length()-pos);std::cout<<tmp<<"]#";}/**获取当前用户名*/voidgetIdname(){structpasswd*pwd;pwd=getpwuid(getuid());std::cout<<"["<<pwd->pw_name<<"@";}/**获取当前主机名*/voidgetHostName(){charbuf_w[128];inthostname=gethostname(buf_w,sizeof(buf_w));std::cout<<buf_w<<"";}/**显示菜单*/voidshowMenu(){getIdname();getHostName();getCurPwd();}
四、完整代码
/*---------------------------------------------------------------------- >FileName:shellDemo.cpp >Author:Jxiepc >Mail:Jxiepc >CreatedTime:Sun19Dec202111:24:21AMCST----------------------------------------------------------------------*/#include<iostream>#include<string>#include<cstring>#include<vector>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<pwd.h>#include<wait.h>/*存储命令以及参数*/std::vector<std::vector<std::string>>vc;/***进行命令行解析:*多个空格*分割符:<>|**/voidparse(){std::stringline;getline(std::cin,line);/**解析字符串*/intlen=line.size(),i=0;std::stringtmp;std::vector<std::string>tmp_vc;while(i<line.size()){if(line[i]==''){i++;continue;}if(line[i]=='|'){vc.push_back(tmp_vc);tmp="";i++;continue;}intpos=line.find('',i);//获取下一个空格的位置tmp=line.substr(i,pos-i);//截取字符串tmp_vc.push_back(tmp);i=pos;}vc.push_back(tmp_vc);}/**执行命令子函数*/voidfunc(std::vector<std::string>&v){char*arr[10];pid_tpid;pid=fork();if(pid==-1){std::cout<<"forkerror"<<std::endl;exit(1);}elseif(pid==0){for(inti=0;i<v.size();++i)arr[i]=(char*)v[i].c_str();arr[v.size()]=NULL;execvp(arr[0],arr);}else{wait(NULL);}}/**执行命令*--------*创建子进程执行*当出现|需要创建多个子进程*当出现><则将内容写入文件或者命令行**/voidexecCommnd(){for(inti=0;i<vc.size();++i){func(vc[i]);}}/**获取当前所在目录*/voidgetCurPwd(){std::strings=get_current_dir_name();intpos=s.rfind('/');std::stringtmp=s.substr(pos+1,s.length()-pos);std::cout<<tmp<<"]#";}/**获取当前用户名*/voidgetIdname(){structpasswd*pwd;pwd=getpwuid(getuid());std::cout<<"["<<pwd->pw_name<<"@";}/**获取当前主机名*/voidgetHostName(){charbuf_w[128];inthostname=gethostname(buf_w,sizeof(buf_w));std::cout<<buf_w<<"";}/**显示菜单*/voidshowMenu(){getIdname();getHostName();getCurPwd();}voidtest(){while(1){showMenu();parse();execCommnd();}}intmain(intargc,char*argv[]){test();return0;}
四、运行结果
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
C++如何实现模拟shell命令行的详细内容,希望对您有所帮助,信息来源于网络。