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

用jsp做肯德基的网站设计软件需要多少钱

用jsp做肯德基的网站,设计软件需要多少钱,企业展示型网站php,关于解决网站 建设经费的请示送给大家一句话#xff1a; 不管前方的路有多苦#xff0c;只要走的方向正确#xff0c;不管多么崎岖不平#xff0c;都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码… 送给大家一句话 不管前方的路有多苦只要走的方向正确不管多么崎岖不平都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码Thanks♪(ω)谢谢阅读下一篇文章见 1 前言 前几篇文章我们学习进程的相关知识进程概念进程替换进程控制。熟悉了进程到底是个什么事情接下来我们来做一个实践来运用我们所学的相关知识。这个项目就是手搓一个shell模块模拟实现Xshell中的命令行输入。 用下图的时间轴来表示事件的发生次序。其中时间从左向右。shell由标识为sh的方块代表它随着时间的流逝从左向右移动。shell从用户读入字符串ls。shell建立一个新的进程然后在那个进程中运行ls程序并等待那个进程结束 然后shell读取新的一行输入建立一个新的进程在这个进程中运行程序 并等待这个进程结束。 所以要写一个shell需要循环以下过程: 获取命令行解析命令行建立一个子进程fork防止打扰主程序的运行替换子进程execvp来执行对应功能。父进程等待子进程退出wait 根据这些思路和我们前面的学的技术就可以自己来实现一个shell了 2 项目实现 为了保证项目文件的优雅美观我们按照功能来书写不同函数 创建自己的命令行获取命令分割命令创建进程执行命令 2.1 创建命令行 该模块我们需要实现类似 获取这些信息大家应该都知道吧通过对环境变量我们就可以获取到这些信息。使用getenv()函数就可以完成操作。 #includestdio.h2 #includesys/types.h3 #includesys/wait.h4 #includestdlib.h5 #includeunistd.h6 #includestring.h7 //大小宏8 #define SIZE 2569 //获取用户名10 const char* GetUsername() 11 {12 const char* name getenv(USER);13 if(name NULL) return NONE;14 return name; 15 }16 //获取机器信息17 const char* GetHostName()18 {19 const char* hostname getenv(HOSTNAME);20 return hostname; 21 }22 //获取当前目录23 const char* GetCwd()24 {25 const char* cwd getenv(PWD);26 if(cwd NULL) return NONE;27 return cwd;28 }29 30 void MakeCommandLineAndPrint()31 { //设置命令行字符串32 char line[SIZE];33 const char* username GetUsername();34 const char* hostname GetHostName();35 const char* cwd GetCwd();//将获取的三个数据写入命令行中 36 sprintf(line,[%s%s %s] ,username,hostname,cwd); 37 printf(%s,line);38 fflush(stdout);//为了将命令行刷新出来39 }40 41 int main()42 {43 //创建我们自己的命令行44 MakeCommandLineAndPrint();45 int a 0; scanf(%d,a); //阻断一下方便查看46 return 0;47 }这里使用的sprintf()函数是向流中写入格式化信息的好工具。这一段函数大家都可以看明白就是获取三个变量然后通过Line数组进行中转然后打印出来。来看效果 这时候发现我们的所在目录全部都别打印出来了我们可以进行一下优化 #define SkipPath(p) do{ p strlen(p)-1 ;while(*p ! /) p--; p; }while(0); 通过这个宏定义就可以只保留最后的目录。 这里之所以不使用函数是因为使用函数会涉及二级指针会比较复杂 来看效果 这样就非常完美了 2.2 获取命令 这个模块可以说是非常关键的一步了只有正确获取了对应命令我们才好打开新进程来执行命令。 #define ZERO \045 int GetUserCommand(char* command,int n)46 {47 if(command NULL) return -1;48 fgets(command,n,stdin);49 command[strlen(command) - 1] ZERO; 50 return strlen(command);51 } 这样我们就可以获取命令行输入的字符串了。 2.3 分割命令 获取命令之后我们还需要对输入的一串命令来进行分割来保证我们可以正常执行命令 12 #define SEP ...14 //全局命令 方便操作15 char* gArgv[NUM];...58 void SplitCommand(char command[] , size_t n)59 {60 (void)n;61 gArgv[0] strtok(command,SEP);62 int index 1;63 // done, 故意写成,表示先赋值在判断. 分割之后strtok会返回NULL刚好让gArgv最后一个元素是NULL, 并且while判断结束64 while((gArgv[index] strtok(NULL,SEP)));65 } 我们使用来strtok()函数 char *strtok(char *str, const char *delim)str—要被分解的字符串delim—用作分隔符的字符可以是一个也可以是集合在这里我们使用宏定义SEP 代表 “ ” 第一次调用strtok()传入的参数str是要被分割的字符串{aaa - bbb -ccc}而成功后返回的是第一个子字符串{aaa} 第二次调用strtok的时候传入的参数应该为NULL这样使该函数默认使用上一次未分割完的字符串继续分割 就从上一次分割的位置作为本次分割的起始位置直到分割结束。strtok内部会记录相应信息 这样就成功分割命令来看效果 我们的准备工作做完了接下来就可以进行最终的操作创建新进程来执行命令 2.4 运行命令 运行命令就要使用 创建子进程进程替换 这两个加在一起就有了非常牛批的力量究极POWER。 68 //执行命令69 void ExecuteCommand()70 {//创建子进程71 pid_t id fork(); 72 if(id 0) 73 { //进程替换 74 execvp(gArgv[0],gArgv); 75 exit(errno); 76 } 77 else 78 { 79 int status 0; 80 pid_t rid waitpid(id,status,0);//进程等待 81 if(rid 0) 82 { //如果错误打印错误信息 83 int lastcode WEXITSTATUS(status); 84 if(lastcode ! 0) printf(%s:%s:%d\n,gArgv[0],strerror(lastcode),lastcode); 85 } 86 } 87 } 前面已经做好大部分工作了执行命令这一步就很简单了。来看效果 这样就完成了绝大部分的代码编写。我们在加上一个while循环让命令行一直运行试试: 这样就实现了shell的大部分功能但是还是有一些功能没有做到比如我们运行cd等内建命令时会无法运行所以我要加上特殊情况来保证内建命令可以执行 90 char* GetHome()91 {92 char* home getenv(HOME);93 return home;94 }95 96 char cwd[SIZE];97 98 void cd()99 { 100 const char* path gArgv[1]; 101 if(path NULL) path GetHome(); 102 chdir(path); 103 104 char temp[SIZE]; 105 getcwd(temp,sizeof(temp)); 106 snprintf(cwd,sizeof(cwd),PWD%s,temp); 107 putenv(cwd); 108 } 109 110 //检查是否为内建命令 并单独执行 111 bool CheckBuildin() 112 { 113 bool yes false; 114 //if语句判断即可内建命令是有限的 115 if(strcmp(gArgv[0],cd) 0) 116 { 117 cd(); 118 yes true; 119 } 120 return yes; 121 } 123 int main() 124 { 125 int quit 0; 126 127 while(!quit) 128 { 129 130 //创建我们自己的命令行 131 MakeCommandLineAndPrint(); 132 133 //获取命令行信息 134 char usercommand[SIZE]; 135 int n GetUserCommand(usercommand,sizeof(usercommand)); 136 if(n 0) return 1; 137 138 //分割命令行信息 139 SplitCommand(usercommand, sizeof(usercommand)); 140 141 bool judge CheckBuildin(); 142 if(judge) continue; 143 144 //执行命令 145 ExecuteCommand(); 146 } 147 148 149 return 0; 150 } 这样把内建命令单独进行运行就可以了我这里只写了一个cd命令。来看效果 这样就完成了我们的自主shell编写 3 源代码 #includestdio.h2 #includesys/types.h3 #includesys/wait.h4 #includestdlib.h5 #includeunistd.h6 #includestring.h7 #includeerrno.h8 #includestdbool.h 9 10 #define SIZE 25611 #define SkipPath(p) do{ p strlen(p)-1 ;while(*p ! /) p--; }while(0); 12 #define ZERO \013 #define NUM 3214 #define SEP 15 16 //命令17 char* gArgv[NUM];18 int lastcode 0;19 char cwd[SIZE];20 21 const char* GetUsername()22 {23 const char* name getenv(USER);24 if(name NULL) return NONE;25 return name; 26 }27 28 const char* GetHostName()29 {30 const char* hostname getenv(HOSTNAME);31 return hostname; 32 }33 34 const char* GetCwd()35 {36 const char* cwd getenv(PWD);37 if(cwd NULL) return NONE;38 return cwd;39 }40 41 void MakeCommandLineAndPrint()42 {43 char line[SIZE];44 const char* username GetUsername(); 45 const char* hostname GetHostName();46 const char* cwd GetCwd();47 SkipPath(cwd);48 sprintf(line,[%s%s %s] ,username,hostname,strlen(cwd) 1?/:cwd 1);49 printf(%s,line);50 fflush(stdout);51 } 52 53 int GetUserCommand(char command[] ,size_t n)54 {55 char* s fgets(command,n,stdin);56 if(s NULL) return -1;57 command[strlen(command) - 1] ZERO; 58 return strlen(command);59 }60 61 void SplitCommand(char command[] , size_t n)62 {63 (void)n;64 gArgv[0] strtok(command,SEP);65 int index 1;66 // done, 故意写成,表示先赋值在判断. 分割之后strtok会返回NULL刚好让gArgv最后一个元素是NULL, 并且while判断结束67 while((gArgv[index] strtok(NULL,SEP)));68 } 69 70 //执行命令71 void ExecuteCommand()72 {73 pid_t id fork();74 if(id 0)75 {76 execvp(gArgv[0],gArgv);77 exit(errno);78 }79 else80 {81 int status 0;82 pid_t rid waitpid(id,status,0);83 if(rid 0)84 {85 lastcode WEXITSTATUS(status);86 if(lastcode ! 0) printf(%s:%s:%d\n,gArgv[0],strerror(lastcode),lastcode);87 }88 } 89 }90 91 char* GetHome()92 {93 char* home getenv(HOME);94 return home;95 }96 97 98 void cd()99 { 100 const char* path gArgv[1]; 101 if(path NULL) path GetHome(); 102 chdir(path); 103 104 char temp[SIZE]; 105 getcwd(temp,sizeof(temp)); 106 snprintf(cwd,sizeof(cwd),PWD%s,temp); 107 putenv(cwd); 108 } 109 110 //检查是否为内建命令 并单独执行 111 bool CheckBuildin() 112 { 113 bool yes false; 114 //if语句判断即可内建命令是有限的 115 if(strcmp(gArgv[0],cd) 0) 116 { 117 cd(); 118 yes true; 119 } 120 return yes; 121 } 122 123 int main() 124 { 125 int quit 0; 126 127 while(!quit) 128 { 129 130 //创建我们自己的命令行 131 MakeCommandLineAndPrint(); 132 133 //获取命令行信息 134 char usercommand[SIZE]; 135 int n GetUserCommand(usercommand,sizeof(usercommand)); 136 if(n 0) return 1; 137 138 //分割命令行信息 139 SplitCommand(usercommand, sizeof(usercommand)); 140 141 bool judge CheckBuildin(); 142 if(judge) continue; 143 144 //执行命令 145 ExecuteCommand(); 146 } 147 148 149 return 0; 150 } Thanks♪(ω)谢谢阅读 下一篇文章见
http://www.w-s-a.com/news/598560/

相关文章:

  • 怎么做自动提卡网站谷歌推广怎么做
  • 大同网站建设熊掌号wordpress 首页单页
  • 青岛网站美工成都优秀网站建设
  • 聊城大型门户网站建设多版本wordpress
  • 建网站的公司 快云wordpress的搜索
  • 贷款网站模版东莞网站建设哪家专业
  • 做做网站已更新878网站正在建设中
  • dz旅游网站模板网站上做百度广告赚钱么
  • 青岛外贸假发网站建设seo优化名词解释
  • 四川建设厅网站施工员证查询网站建设行业政策
  • 网站全站出售dw怎么设计网页
  • 合肥网站建设方案服务网站建设推荐郑国华
  • 襄阳网站建设需要多少钱台州网站设计公司网站
  • 东莞专业拍摄做网站照片如何在百度上发布自己的广告
  • 网站建设费 科目做网站建设最好学什么
  • php商城网站建设多少钱深圳市建设
  • 有什么做糕点的视频网站黄岛做网站
  • 做视频课程网站建设一个普通网站需要多少钱
  • 专做化妆品的网站合肥做网站建设公司
  • 唐山企业网站网站建设费计入那个科目
  • 企业网站制作运营彩虹云主机官网
  • 如何建设废品网站如何在阿里云云服务器上搭建网站
  • 如何建立网站后台程序wordpress 后台管理
  • 山东外贸网站建设怎么样wordpress首页左图右文
  • 志丹网站建设wordpress 形式修改
  • 南通seo网站推广费用网站建设就业前景
  • 自适应网站做mip改造浏览器广告投放
  • 网站meta网页描述网站的推广费用
  • 偃师市住房和城乡建设局网站网站个人主页怎么做
  • 做网站要实名认证吗wordpress去掉仪表盘