当前位置: 首页 > news >正文

智能响应式网站淳安县住房和城乡建设局网站

智能响应式网站,淳安县住房和城乡建设局网站,网站制作案例策划,昌平区做网站目录 一#xff0c;跟正宗的bash见个面 二#xff0c;实现一个山寨的bash 1.提示符 2.输入命令与回显命令 3.解析命令 4.执行命令 5.执行逻辑 三#xff0c;全部代码 一#xff0c;跟正宗的bash见个面 在这篇文章中#xff0c;我会写一个myshell小程序。这个小程序… 目录 一跟正宗的bash见个面 二实现一个山寨的bash 1.提示符 2.输入命令与回显命令 3.解析命令 4.执行命令 5.执行逻辑 三全部代码 一跟正宗的bash见个面 在这篇文章中我会写一个myshell小程序。这个小程序其实就是一个解释器。在我的机器上它长这样     二实现一个山寨的bash 1.提示符 在图 中。这个提示符的信息可以分为四类 1.用户名    2.主机名   3.当前地址   4.其他字符 在这个图片里cq就是用户名  VM-8-9-centos就是主机名   mybash就是当前所在路径。 那我们该如何获取呢两条路1.其它字符直接打印  2.用户名等用环境变量获取。代码如下 #includestdio.h #includestdlib.h//getenv的头文件 const char* Username()//获取用户名 { const char* user getenv(USER); if(user) return user; return none; } const char* Hostname()//获取主机名 { const char* host getenv(HOSTNAME); if(host) return host; return none; } const char* Pwd() //获取当前地址 { const char* pwd getenv(PWD); if(pwd) return pwd; return none; } int main() { printf([%s%s %s]#\n,Username(),Hostname(),Pwd()); return 0; } 效果 可以看到我们当前的提示符显示是可以成功的。 2.输入命令与回显命令 想到输入和显示命令时我猜很多同学的脑子里第一个想到的便是scanf和printf。但是在这里我们是不能使用scanf的。因为我们在输入命令的时候一定会遇到输入空格的情况如ls -a -l命令等等。但是scanf在遇到空格的时候便会停下。所以我们不能使用scanf进行读取数据。所以我们采用gets或者fgets来读取数据。    这两个函数介绍如下 gets函数是将键盘上的输入读取到str缓冲区里存起来。 fgets的功能跟gets一样这三个参数的意思如下1.str表示存储读取到数据的地方 2.num 存储的最大数据量  。 3.stream表示从何读取键盘读取则为stdin。 写出代码如下 char buff[1024]\\一般将这个数组定义为全局的fgets(buff,sizeof(buff),stdin); buff[strlen(buff)-1] \0; \\将回车符给吞掉 printf(%s\n,buff); 封装函数如下 void getCommand() { fgets(buff,sizeof(buff),stdin); buff[strlen(buff)-1] \0; } 效果 3.解析命令 在这里解析命令的意思便是将一个长字符串以空格为分隔符分割成一个一个短的字符串。比如ls -a -l就应该分成ls -a -l。在这里我们要使用到一个字符串分割函数: 这个函数的参数str表示要分割的字符串  delimiters表示分割符。并且要注意的是当我的第一次分割成功以后我后面的连续分割就可以将str用NULL表示。先在写出代码如下 void splictCommand(char* in,char* out[]) \\注意这里的参数in是buff,out是char* argv。这两个参数都定义在全局 { int argc 0; out[argc] strtok(in,SEP); while(out[argc] strtok(NULL,SEP)); #ifdef Debug \\用来测试 for(int i 0;out[i];i) printf(%d:%s\n,i,out[i]); #endif } 效果分割完成 4.执行命令 在完成输入和解析命令以后我们就得来执行命令了。我们如何实现命令的执行呢 1.创建子进程    2.使用程序替换。 在这里要了解的是有一些命令是必须要让父进程来执行的。比如cd export echo等。这些命令叫做内建命令。还有一些命令则不需要由父进程来来执行而是要交由子进程来执行。所以我们得创建子进程。 在执行命令的时候步骤如下 1.先检查是否是内建命令若是便执行并且返回一个1。若不是便返回0。 代码 int dobuildin(char* argv[]){if(strcmp(argv[0],cd) 0)//cd是内建命令{char* path NULL;if(argv[1] NULL) path getHome();else path argv[1];cd(path); return 1;}else if(strcmp(argv[0],export) 0)//export是内建命令{if(argv[1] NULL) return 1; strcpy(enval,argv[1]);putenv(enval);return 1;}else if(strcmp(argv[0],echo)0)//echo是内建命令{ if(argv[1] NULL){printf(\n);}else{if(argv[1] NULL) {printf(\n);return 1;}if(*(argv[1])$strlen(argv[1])1){char* val argv[1]1;if(strcmp(val,?)0){printf(%d\n,lastcode);lastcode 0;}else printf(%s\n,getenv(val));}else{printf(%s\n,argv[1]);}return 1;}}return 0;//不是内建命令便返回0}然后才是执行其它命令 void excute(char* argv[]){pid_t id fork();//创建子进程if(id 0)//子进程执行程序替换{execvp(argv[0],argv);exit(1);//执行完便可以退出}else {int status 0;pid_t rid waitpid(id,status,0);//等待子进程if(rid0){//等待成功lastcode WEXITSTATUS(status);//获取最后一次的退出码}}}执行逻辑 n dobuildin(argv);//检查并执行内建命令if(n) continue;excute(argv);//子进程执行命令这两个函数的执行顺序如上。如果内建命令执行成功在这一次便可以不再执行下面的普通命令的代码。如果不成功便可以执行下面的普通命令的代码。 5.执行逻辑 int main(){while(1){ char Usercommand[NUM];int n getCommand(Usercommand,sizeof(Usercommand));//获取命令if(n0) continue;char* argv[SIZE];splictCommand(Usercommand,argv);//将命令打散放到数组中 n dobuildin(argv);//检查并执行内建命令if(n) continue;excute(argv);//子进程执行命令}return 0;}三全部代码 #includestdio.h #includestdlib.h//getenv的头文件 #includestring.h #includeunistd.h//fork的头文件 #includesys/types.h//要使用pid_t必须包含的头文件 #includewait.h#define Debug 1 char buff[1024]; char* argv[64]; char enval[1024];//用来存储全局的环境变量 char cwd[1024]; int lastcode 0;#define SEP const char* Username()//获取用户名 {const char* user getenv(USER);if(user) return user;return none; }const char* Hostname()//获取主机名 {const char* host getenv(HOSTNAME);if(host) return host;return none; }const char* Pwd() {const char* pwd getenv(PWD);if(pwd) return pwd;return .; }char* getHome() {char* home getenv(HOME);if(home) return home;return(char*) none; }int getCommand() {printf([%s%s %s]#,Username(),Hostname(),Pwd());char* str fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1] \0;if(str) return strlen(str)-1;return -1; }void splictCommand(char* in,char* out[]) {int argc 0;out[argc] strtok(in,SEP);while(out[argc] strtok(NULL,SEP)); #ifdef Debugfor(int i 0;out[i];i)printf(%d:%s\n,i,out[i]); #endif }void cd( char* path) {if(path NULL){path getHome();}int i chdir(path);printf(%d\n,i);char temp[1024];getcwd(temp,sizeof(temp));//获取pwd并放到临时变量temp中sprintf(cwd,PWD%s,temp);将pwd放到全局变量cwd中putenv(cwd);//用cwd替换掉PWD内的内容实现改变PWD的目的 }int dobuildin( char* argv[]) {if(strcmp(argv[0],cd) 0){char* path argv[1]; cd(path);return 1;}else if(strcmp(argv[0],export) 0){char* val argv[1];if(val NULL) return 1;strcpy(enval,val);putenv(enval);return 1;}else if(strcmp(argv[0],echo) 0){if(*argv[1]$strlen(argv[1])1){char* val argv[1]1;//$?,$PATHif(strcmp(val,?)0){printf(%d\n,lastcode);//显示最近一次错误码lastcode 0;return 1;} else {printf(%s\n,getenv(val));} }else{printf(%s\n,argv[1]);}return 1;}return 0; }void excute(char* argv[]) {pid_t id fork();if(id 0)//子进程 {execvp(argv[0],argv);exit(1);}else//父进程{int status 0;pid_t rid waitpid(id,status,0);//等待子进程if(rid0){lastcode WEXITSTATUS(status); //获取退出码} } }int main() {while(1){int n getCommand();if(n0) continue;splictCommand(buff,argv);n dobuildin(argv);if(n) continue;excute(argv); }return 0; }
http://www.zqtcl.cn/news/602033/

相关文章:

  • 招投标网站开发企业网站建设之后
  • 如何做好集团网站建设怎么做门淘宝网站
  • 医疗协助平台网站建设方案学生个人网页制作html报告
  • 专注于网站营销服务新浪云搭建wordpress
  • 免费自助建站代理鞍山招聘网最新招聘
  • 营销型类型网站有哪些类型php网站后台制作
  • 安全的网站制作公司百度app最新版本
  • 中小企业建站平台耐克网站建设策划方案
  • wordpress 后台加入链接后_网站显示是标签_不是链接wms智能仓储管理系统
  • 网站建设需要什么硬件和软件有哪些中考网络应用服务平台
  • 为什么网站权重会掉房地产开发网站建设
  • 大连seo整站优化酷播wordpress视频插件
  • 好的网页设计网站学编程要什么学历
  • 做网站公司电话福建城乡建设网站查询
  • 郑州做网站哪个公司好做二手市场类型的网站名字
  • 网站建设与维护里面的个人简历选择网站建设公司好
  • 济南浩辰网站建设公司怎么样wordpress 3.8 问题
  • 柳州正规网站制作公司网站ww正能量
  • 网站seo优化工具网站推广策略方法
  • 企业网站建设知名wordpress 自定义php
  • 用php做的网站有哪些全能网站建设
  • 网站显示正在建设中wordpress 排行榜 页面
  • 手机管理网站网站打开速度优化
  • 做微网站需要什么做的比较好的美食网站有哪些
  • 五金商城网站建设注意wordpress虚拟空
  • 成都工程网站建设网站界面设计的优点
  • 网站建设里的知识找别人做公司网站第一步做什么
  • 婚纱摄影网站模板之家专业seo网站优化公司
  • 商丘市住房和城乡建设局网站广西网站建设timkee
  • php网站开发是做什么的网站策划总结