C++如何实现模拟shell命令行(C++,shell,开发技术)

时间:2024-05-09 07:11:27 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

一、解析

/***进行命令行解析:*多个空格*分割符:<>|**/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;}

四、运行结果

C++如何实现模拟shell命令行

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C++如何实现模拟shell命令行的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python如何制作子弹图下一篇:

9 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18