C++如何实现模拟shell命令行
短信预约 -IT技能 免费直播动态提醒
这篇文章给大家分享的是有关C++如何实现模拟shell命令行的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、解析
void parse(){ std::string line; getline(std::cin, line); int len = line.size(), i=0; std::string tmp; 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; } int pos = line.find(' ', i); // 获取下一个空格的位置 tmp = line.substr(i, pos-i); // 截取字符串 tmp_vc.push_back(tmp); i = pos; } vc.push_back(tmp_vc);}
二、执行命令函数
void func(std::vector<std::string>& v){ char *arr[10]; pid_t pid; pid = fork(); if(pid == -1){ std::cout << "fork error" << std::endl; exit(1); }else if(pid ==0){ for(int i=0; i<v.size(); ++i) arr[i] = (char *)v[i].c_str(); arr[v.size()] = NULL; execvp(arr[0], arr); }else{ wait(NULL); }}void execCommnd(){ for(int i=0; i<vc.size(); ++i){ func(vc[i]); }}
三、模拟shell
void getCurPwd(){ std::string s = get_current_dir_name(); int pos = s.rfind('/'); std::string tmp = s.substr(pos+1, s.length()-pos); std::cout << tmp << "]# ";}void getIdname(){ struct passwd *pwd; pwd = getpwuid(getuid()); std::cout << "[" <<pwd->pw_name << "@";}void getHostName(){ char buf_w[128]; int hostname = gethostname(buf_w, sizeof(buf_w)); std::cout << buf_w << " "; }void showMenu(){ getIdname(); getHostName(); getCurPwd();}
四、完整代码
#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;void parse(){ std::string line; getline(std::cin, line); int len = line.size(), i=0; std::string tmp; 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; } int pos = line.find(' ', i); // 获取下一个空格的位置 tmp = line.substr(i, pos-i); // 截取字符串 tmp_vc.push_back(tmp); i = pos; } vc.push_back(tmp_vc);}void func(std::vector<std::string>& v){ char *arr[10]; pid_t pid; pid = fork(); if(pid == -1){ std::cout << "fork error" << std::endl; exit(1); }else if(pid ==0){ for(int i=0; i<v.size(); ++i) arr[i] = (char *)v[i].c_str(); arr[v.size()] = NULL; execvp(arr[0], arr); }else{ wait(NULL); }}void execCommnd(){ for(int i=0; i<vc.size(); ++i){ func(vc[i]); }}void getCurPwd(){ std::string s = get_current_dir_name(); int pos = s.rfind('/'); std::string tmp = s.substr(pos+1, s.length()-pos); std::cout << tmp << "]# ";}void getIdname(){ struct passwd *pwd; pwd = getpwuid(getuid()); std::cout << "[" <<pwd->pw_name << "@";}void getHostName(){ char buf_w[128]; int hostname = gethostname(buf_w, sizeof(buf_w)); std::cout << buf_w << " "; }void showMenu(){ getIdname(); getHostName(); getCurPwd();}void test(){ while(1){ showMenu(); parse(); execCommnd(); }}int main(int argc, char* argv[]){ test(); return 0;}
四、运行结果
感谢各位的阅读!关于“C++如何实现模拟shell命令行”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341