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

商城网站建设定制网站建设福州网站制作服务

商城网站建设定制网站建设,福州网站制作服务,荷花直播免费直播下载安装手机版,php做网站用框架📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、Shell程序思路二、Shell代码展示 一、Shell程序思路 用下图的时间轴来表示事件的发生次序…

在这里插入图片描述


📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、Shell程序思路
  • 二、Shell代码展示


一、Shell程序思路

用下图的时间轴来表示事件的发生次序。其中时间从左向右。shell由标识为sh的方块代表,它随着时间的流逝从左向右移动。shell从用户读入字符串"ls"。shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。
在这里插入图片描述
然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序 并等待这个进程结束。

  1. 获取命令行
  2. 解析命令行
  3. 建立一个子进程(fork)
  4. 替换子进程(execvp)
  5. 父进程等待子进程退出(wait)
    根据这些思路,和我们前面的学的技术,就可以自己来实现一个shell了。

二、Shell代码展示

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>#define NUM 1024
#define SIZE 64
#define SEP " "
//#define Debug 1char cwd[1024];
char enval[1024]; // for test
int lastcode = 0;char *homepath()
{char *home = getenv("HOME");if(home) return home;else return (char*)".";
}const char *getUsername()
{const char *name = getenv("USER");if(name) return name;else return "none";
}
const char *getHostname()
{const char *hostname = getenv("HOSTNAME");if(hostname) return hostname;else return "none";
}
const char *getCwd()
{const char *cwd = getenv("PWD");if(cwd) return cwd;else return "none";
}
int getUserCommand(char *command, int num)
{printf("[%s@%s %s]# ", getUsername(), getHostname(), getCwd());char *r = fgets(command, num, stdin); // 最终你还是会输入\nif(r == NULL) return -1;// "abcd\n" "\n"command[strlen(command) - 1] = '\0'; // 有没有可能越界?不会return strlen(command);
}void commandSplit(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
}int execute(char *argv[])
{pid_t id = fork();if(id < 0) return -1;else if(id == 0) //child{// exec commandexecvp(argv[0], argv); // cd ..exit(1);}else // father{int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid > 0){lastcode = WEXITSTATUS(status);}}return 0;
}void cd(const char *path)
{chdir(path);char tmp[1024];getcwd(tmp, sizeof(tmp));sprintf(cwd, "PWD=%s", tmp); // bugputenv(cwd);
}// 什么叫做内键命令: 内建命令就是bash自己执行的,类似于自己内部的一个函数!
// 1->yes, 0->no, -1->err
int doBuildin(char *argv[])
{if(strcmp(argv[0], "cd") == 0){char *path = NULL;if(argv[1] == NULL) path=homepath();else path = argv[1];cd(path);return 1;}else if(strcmp(argv[0], "export") == 0){if(argv[1] == NULL) return 1;strcpy(enval, argv[1]);putenv(enval); // ???return 1;}else if(strcmp(argv[0], "echo") == 0){if(argv[1] == NULL){printf("\n");return 1;}if(*(argv[1]) == '$' && strlen(argv[1]) > 1){ char *val = argv[1]+1; // $PATH $?if(strcmp(val, "?") == 0){printf("%d\n", lastcode);lastcode = 0;}else{const char *enval = getenv(val);if(enval) printf("%s\n", enval);else printf("\n");}return 1;}else {printf("%s\n", argv[1]);return 1;}}else if(0){}return 0;
}int main()
{while(1){char usercommand[NUM];char *argv[SIZE];// 1. 打印提示符&&获取用户命令字符串获取成功int n = getUserCommand(usercommand, sizeof(usercommand));if(n <= 0) continue;// 2. 分割字符串// "ls -a -l" -> "ls" "-a" "-l"commandSplit(usercommand, argv);// 3. check build-in commandn = doBuildin(argv);if(n) continue;// 4. 执行对应的命令execute(argv);}
}

http://www.yayakq.cn/news/62401/

相关文章:

  • 广州网站建设信科网络做网站需准备些什么软件
  • 曲靖网站推广wordpress小说站主题
  • 图书馆网站建设策划青岛外贸推广
  • 建设网站的工具是什么程序员外包接单
  • 网站 不备案网站建设服装在线商城实训报告
  • 网站ui设计外贸有哪些网站
  • 关于网站建设与维护论文天元建设集团有限公司张桂玉丑闻
  • 泰安网站seo怎么查公司的邮箱
  • 颍上县建设局网站苏州建设银行招聘网站
  • 私人做网站图片什么是网络营销包含哪些内容
  • 毕业纪念册设计制作图片网站优化排名资源
  • 重新安wordpress网站本地搭建wordpress
  • 怎么样做一家卖东西的网站网站建设找单
  • 茂名手机网站制作企业网站设计建设长春
  • 免费咨询法律问题的网站中文搜索引擎有哪些平台
  • 广州做网站一般要多少钱做3d效果在哪个网站
  • 网站开发管理渠道网络推广
  • 湖北网站建设平台做网站买过域名之后
  • 要学做游戏上什么网站学好青岛网站设计公司电话
  • 做网站优化哪家公司好中铁建设集团有限公司下属公司
  • 微信支付需要网站备案书签
  • 门户网站等保二级建设方案网站建设有哪三部
  • 网站建设费计入什么科目比较好做网站项目体会
  • 做调查问卷换赏金的网站官网制作报价
  • 如何做网站的优化小程序推广模式和营销方案
  • 辽阳做网站百度竞价点击软件
  • 自己做电影网站犯法吗传奇版本网页游戏
  • 和林格尔网站制作自己创建一个公司
  • 陕西省住房和城乡建设厅门户网站网站运营技巧
  • 阿里云医疗网站建设网站开发怎么做账