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

义乌网站建设工作室高端网站制作公

义乌网站建设工作室,高端网站制作公,垫江网站建设,名聚优品一家只做正品的网站文章目录 1.框架2.命令行3.获取用户命令字符串4.命令行字符串分割5.执行命令和内建命令6.完整代码#xff1a; 1.框架 我们知道shell是一直存在的#xff0c;所以首先我们第一步就是要搭建一个框架#xff0c;使其一直存在。 那么也很简单#xff0c;一个while循环就可以完… 文章目录 1.框架2.命令行3.获取用户命令字符串4.命令行字符串分割5.执行命令和内建命令6.完整代码 1.框架 我们知道shell是一直存在的所以首先我们第一步就是要搭建一个框架使其一直存在。 那么也很简单一个while循环就可以完成。 2.命令行 我们的shell最前面都是有一个命令行的 。如下图 那么命令行我们应该怎么获取呢我们可以从环境变量中获取env查看环境变量。 getenv函数就可以帮我们获取环境变量可以获取用户名、地址等等 getenv获取成功就会取到那个对象如果获取失败就会返回空 然后我们需要把上面获取到的三个字符拼接在一起这时候就需要用到snprintf函数了 到这里第一步就结束了 3.获取用户命令字符串 这一步我们需要获取命令字符串因为有空格。我们无法使用scanf。这里使用fgets 4.命令行字符串分割 分割思路 具体分割我们可以使用strtok函数 但是这里有个需要注意的地方strtok的第二参数需要是一个字符串 5.执行命令和内建命令 内建命令 6.完整代码 以上就是编写shell的大致思路了上面的shell为了和系统本身的shell做区分所以前的路径都是绝对路径一长串。 myshell.c: #include stdio.h #include stdlib.h #include string.h #include errno.h #include unistd.h #include sys/types.h #include sys/wait.h#define SIZE 512 #define ZERO \0 #define SEP #define NUM 32// 为了方便我就直接定义了 char cwd[SIZE*2]; char *gArgv[NUM]; int lastcode 0;void Die() {exit(1); }//获取家目录 const char *GetHome() {const char *home getenv(HOME);if(home NULL) return /;return home; }//获取用户名 const char *GetUserName() {const char *name getenv(USER);if(name NULL) return None;return name; } //获取主机名 const char *GetHostName() {const char *hostname getenv(HOSTNAME);if(hostname NULL) return None;return hostname; } //获取路径 const char *GetCwd() {const char *cwd getenv(PWD);if(cwd NULL) return None;return cwd; }int GetUserCommand(char command[], size_t n) {char *s fgets(command, n, stdin);if(s NULL) return -1;command[strlen(command)-1] ZERO;return strlen(command); }void MakeCommandLineAndPrint() {char line[SIZE];const char *username GetUserName();const char *hostname GetHostName();const char *cwd GetCwd();snprintf(line, sizeof(line), [%s%s %s] , username, hostname, cwd);printf(%s, line);fflush(stdout); }void SplitCommand(char command[], size_t n) {(void)n;// ls -a -l -n - ls -a -l -ngArgv[0] strtok(command, SEP);int index 1;while((gArgv[index] strtok(NULL, SEP))); // done, 故意写成,表示先赋值在判断.因为分割之后如果无法分割strtok会返回NULL刚好让gArgv最后一个元素是NULL, 并且while判断结束 }void ExecuteCommand() {pid_t id fork();if(id 0) Die();else if(id 0){// childexecvp(gArgv[0], gArgv);exit(errno);}else{// fahterint status 0;pid_t rid waitpid(id, status, 0);if(rid 0){lastcode WEXITSTATUS(status);if(lastcode ! 0) printf(%s:%s:%d\n, gArgv[0], strerror(lastcode), lastcode);}} }void Cd() {const char *path gArgv[1];if(path NULL) path GetHome();// path 一定存在chdir(path);// 刷新环境变量char temp[SIZE*2];getcwd(temp, sizeof(temp));snprintf(cwd, sizeof(cwd), PWD%s, temp);putenv(cwd); // OK }int CheckBuildin() {int yes 0;const char *enter_cmd gArgv[0];if(strcmp(enter_cmd, cd) 0){yes 1;Cd();}else if(strcmp(enter_cmd, echo) 0 strcmp(gArgv[1], $?) 0){yes 1;printf(%d\n, lastcode);lastcode 0;}return yes; }int main() {//首先自己写的shell需要一直存在所以设置一个while循环 int quite0; while(!quite) {// 1. 我们需要自己输出一个命令行MakeCommandLineAndPrint();// 2. 获取用户命令字符串char usercommand[SIZE];int n GetUserCommand(usercommand, sizeof(usercommand));if(n 0) return 1;// 3. 命令行字符串分割. SplitCommand(usercommand, sizeof(usercommand));// 4. 检测命令是否是内建命令n CheckBuildin();if(n) continue; // 5. 执行命令ExecuteCommand();}return 0; }
http://www.hkea.cn/news/14451006/

相关文章:

  • 深圳高端做网站东莞便宜做网站
  • 深夜小网站网站建设流程 费用
  • 毕业设计论文网站开发需要多少wordpress 屏蔽搜索引擎
  • 浙江做网站找谁免费海外网站建设
  • 青岛网站搜索排名西安网站建设怎样
  • 建设团购网站费用天津seo推广方法
  • 关于网站制作报价网站开发具备的相关知识
  • 建设网站服务器是什么邢台公司做网站多少钱
  • 网站建设是怎么赚钱的系统开发是什么意思
  • 我的网站模板下载不了网站怎么加链接
  • 呼伦贝尔旅游网站建设wordpress轮播图修改
  • 秦皇岛找一家能建网站的公司易思企业网站管理系统
  • nodejs 做网站备案网站名称怎么写个人
  • 手机软件做的相册怎样传到网站diy小程序开发平台
  • 黄骗免费网站如果做微商需不需要开个网站。
  • 建一个自己的网站wordpress iis 中文
  • 昆明专业做网站多少钱seo优化公司哪家好
  • wordpress 主题 google东莞网站优化东莞seo最专业的东莞网络公司小红孩营销
  • 网站建设高端培训学校网页升级紧急通知狼人
  • 网站 网站 建设设置网站维护页面
  • 网站制作软件教程网站动态页面打不开
  • 怎样发布自己的网站wordpress 插马
  • 做一个展示型网站多少钱wordpress 404 调用
  • 辽宁城乡住房建设厅网站打不开十大互联网平台
  • 网站建设模板公司自考本科报名官网入口
  • 六安网站建设 220如何做网站上抓视频
  • 成都三网合一网站建设沈阳网站制作平台
  • jsp.ajax网站开发典型实例南京网站建设推南京网站建设设计
  • 手机友好型网站巩义便宜网站建设费用
  • 做网站的原型 免费如何建设网站兴田德润怎么联系