网站建设分析徐州整站优化

news/2025/9/26 18:02:16/文章来源:
网站建设分析,徐州整站优化,云计算培训,做音箱木工网站shell的模拟实现 我们知道shell是一个永不退出的程序#xff0c;所以他应该是一个死循环#xff0c;并且shell为了防止影响到自己#xff0c;我们在命令行上输入的所有命令都是由shell的子进程来执行的#xff0c;所以它应该要有创建子进程的相关函数#xff0c;当然也会…shell的模拟实现 我们知道shell是一个永不退出的程序所以他应该是一个死循环并且shell为了防止影响到自己我们在命令行上输入的所有命令都是由shell的子进程来执行的所以它应该要有创建子进程的相关函数当然也会有进程替换的相关函数因为我们直接创建子进程父子进程是共享代码的如果没有进程替换shell根本无法让子进程执行特定的命令。 总的思路 1.打印提示符 获取用户命令字符串 2.分割字符串 //“ls -a -l” — “ls” “-a” “-l” 3.check buildin command 检查内键命令 4.执行命令 1.打印提示符 获取用户命令字符串 对于getUserCommand函数 先介绍fgets函数 #define NUM 1024 #define SIZE 64int getUserCommand(char *command,int num) {printf([%s%s %s],getUsername(),getHostname(),getCwd());//不用scanf遇到空格会停不好用char *r fgets(command,num,stdin);//最终还是会输入\nif(r NULL) return -1;//abcd\ncommand[strlen(command) - 1] \0;//给最后加上\0return strlen(command); }getUsername(),getHostname(),getCwd() 是为了读取用户名主机名 当前所在文件夹 2.分割字符串 比如我要执行ls命令ls命令后还可以携带选项ls -a -lshell需要获取指令与选项并将它们分割shell接收到的是一串字符串ls -a -lshell需要将字符串分割为更小的字符串ls “-a” “-l”。 定义char usercommand[NUM];接收一整行的指令该数组中的元素保存的是字符char *argv[SIZE];//存储命令拆分后结果该数组中的元素要保存的是分割后的字符串。 介绍strtok void commandSplit(char *in,char *out[]) {int argc 0;out[argc] strtok(in, );//分隔并放入out指针数组while(out[argc] strtok(NULL, )); }3.check buildin command 检查内键命令 内建命令 开头说到shell的命令分为内部命令和其他命令何为内建命令 内建命令是一个需要shell自己执行的命令即shell不创建子进程自己亲自执行的命令。 shell对于一些命令是必须要亲自执行的比如cd更改工作路径将shell的工作路径修改后由于子进程的工作路径与父进程相同更改分进程的工作路径后父进程创建出的子进程的工作路径也是被修改过的体现给用户的感觉就是当前的工作路径改变了。 对于内建命令shell是怎么实现的 shell中有许多内建命令当shell接收到指令并解析后需要判断用户输入的命令是否为内建命令如果是就执行拦截操作使子进程不再被创建自己执行该指令。如果不是内建命令则创建子进程执行该命令。 内建命令太多代码里面只写了cd和export内建命令。 char cwd[1024];//全局变量 char enval[1024];//for test char *homepath() {char *home getenv(HOME);if(home) return home;else return (char*).; }void cd(const char *path) {chdir(path);//chdir(),用户将当前的工作目录改变成以参数路径所指的目录char tmp[1024];getcwd(tmp,sizeof(tmp));//getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。sprintf(cwd,PWD%s,tmp); //打印到字符串中putenv(cwd);//putenv 函数会将cwd 直接填写到环境表中 }// 什么叫做内键命令: 内建命令就是bash自己执行的类似于自己内部的一个函数 // 1-yes, 0-no, -1-err int doBuildin(char* argv[]) {if(strcmp(argv[0],cd) 0) //cd ...{char *path NULL;if(argv[1] NULL) path homepath();//纯cd回到HOMEelse 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;}return 0; }对于void cd(const char *path)用 chdir() 函数来将 用户当前的工作目录改变成以参数路径所指的目录 用 getcwd() 函数将当前工作目录的绝对路径复制到参数buffer所指的内存空间中 用 sprintf() 函数将 “PWD工作目录” 字符串打印给cwd 用putenv 将cwd 直接填写到环境表中。 4.执行命令 int execute(char *argv[]) {pid_t id fork();if(id 0) return -1;else if(id 0) //child{//exec commandexecvp(argv[0],argv);//execvp()会从环境变量所指的目录中查找符合参数 file 的文件名, 找到后执行该文件, 然后将第二个参数argv 传给该执行的文件。exit(1);}else //father{int status 0;pid_t res waitpid(-1, status, 0);//阻塞式等待if(res 0)//等待成功{printf(exit code: %d \n, WEXITSTATUS(status));}}return 0; }用子进程进行进程替换执行命令 在进行进程替换时使用ececvp()函数 效果动态图 代码 #includestdio.h #includestdlib.h #includestring.h #includeunistd.h #includesys/types.h #includesys/wait.h#define NUM 1024 #define SIZE 64char cwd[1024]; char enval[1024];//for test 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());//不用scanf遇到空格会停不好用char *r fgets(command,num,stdin);//最终还是会输入\nif(r NULL) return -1;//abcd\ncommand[strlen(command) - 1] \0;return strlen(command); }void commandSplit(char *in,char *out[]) {int argc 0;out[argc] strtok(in, );//分隔并放入out指针数组while(out[argc] strtok(NULL, )); }void cd(const char *path) {chdir(path);//chdir(),用户将当前的工作目录改变成以参数路径所指的目录char tmp[1024];getcwd(tmp,sizeof(tmp));//getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。sprintf(cwd,PWD%s,tmp); //打印到字符串中putenv(cwd);//putenv 函数会将c wd 直接填写到环境表中 }// 什么叫做内键命令: 内建命令就是bash自己执行的类似于自己内部的一个函数 // 1-yes, 0-no, -1-err int doBuildin(char* argv[]) {if(strcmp(argv[0],cd) 0) //cd ...{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;}return 0; }int execute(char *argv[]) {pid_t id fork();if(id 0) return -1;else if(id 0) //child{//exec commandexecvp(argv[0],argv);//execvp()会从环境变量所指的目录中查找符合参数 file 的文件名, 找到后执行该文件, 然后将第二个参数argv 传给该执行的文件。exit(1);}else //father{int status 0;pid_t res waitpid(-1, status, 0);//阻塞式等待if(res 0)//等待成功{printf(exit code: %d \n, WEXITSTATUS(status));}}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 -lcommandSplit(usercommand,argv);//3.check buildin command 检查内键命令n doBuildin(argv);if(n) continue;//4.执行命令execute(argv);} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站外链建设工作计划建站合作

第3部分 hashCode() 的作用 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCo…

详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学

详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

静态网站可以做哪些wordpress有后端吗

一.选择题 1、适宜采用inline定义函数情况是(C) A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后&#xff0c…

网站开发招标参数学校网站建设的应用意义案例

来源:SpringBoot 那些天生自带 Buff 的工具类,你用过几个? 断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert …

不用js可以做网站吗网站建设费应开具互联网信息服务吗

本文主要向大家介绍了MySQL数据库之在CentOS7上安装MySQL5.7 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。获取RPM包# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm列出RPM包里都有哪些文件# rpm -q…

公司网站建设应注意事项北京的软件公司集中在哪个区

文章目录 9.1 DApp 的架构和设计9.1.1 基础知识解析更深入的理解实际操作技巧 9.1.2 重点案例:去中心化社交媒体平台案例 Demo:创建去中心化社交媒体平台案例代码SocialMedia.sol - 智能合约前端界面 测试和验证拓展功能 9.1.3 拓展案例 1:去…

59网站一起做网店普宁网站 代备案

1.开启时钟 把需要使用的USART和GPIO的时钟打开 2.GPIO初始化 把TX配置成复用输出,RX配置成输入 3.配置USART 直接使用一个结构体即可将所有参数配置完成 4.开关控制 如果需要仅发送的功能,就直接开启USART&#xff…

网站后台程序手机网页怎么改成电脑版

现在越来越多的人都开始通过二维码的方式来传递文件,将word、pdf、excel、pdf等格式的文件通过扫码的方式展示或者下载文件,这种方式有很多的优势,包括传播速度快成本低,只需要生成一张二维码图片,就可以让其他人能够同…

使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案

使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

单独

单独Q2的季度工作总结: 重点工作任务(含项目) 重点工作任务完成情况 "目标设定说明: 目标设定要符合SMART原则(Specific具体的、Measurable可衡量的、Attainable可达到的、Ralevant相关的、Time-based有时间…

为什么应该测试无JavaScript的页面体验

本文探讨了JavaScript可能失效的各种场景(如网络问题、浏览器扩展限制等),介绍了渐进增强的实践方法,并说明了当页面必须依赖JavaScript时的优雅降级方案。通过具体代码示例展示如何构建更具韧性和可访问性的网站。…

完整教程:UE5小游戏开发 - 武士决斗

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡1 DIP核心思想与三层架构概述 依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模…

网站开发费入什么科目个人简介html代码简单

前言 JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象; DOM 描述了处理网页内容的方法和接口; BOM 描述了与浏览器进行交互的方法和接口。 ECMAScript、DOM 和 BOM 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一…

PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE

PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE 文档来自:PolarFire FPGA and PolarFire SoC FPGA Programming User GuidePolarFire SOC Auto Update 和 IAP 文档阅读一 - 所长 - 博客园 PolarFire SO…

前台部分数据不显示

去数据库查了下,数据都存在,很完整,原因就在前台。 查出来的数据量很大,删除部分数据后,前台正常显示了,应该就是数据量太多,序列化的时候出问题了。 查了下,JsonConvert.SerializeObject 没有“字数”限制,但…

指针定义以及二维数组内存地址(java/c++/python)

一、指针是什么? 指针是一个存储内存地址的变量,它指向(引用)内存中的另一个数据(变量、数组、对象等)。通过指针可以直接访问或修改它所指向的内存中的数据,这使得指针成为直接操作内存的重要工具。 简单说:指…

一款不错的PDF工具,吾爱出品 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解码数据结构线性表之顺序表

顺序表的本质与核心特性 顺序表的定义 顺序表是 “用一组内存地址连续的内存单元依次存储线性表数据元素的存储结构”,其核心是 “逻辑顺序与物理顺序完全一致”—— 即线性表中第i个元素(逻辑上),必然存储在与第i…

中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃

源启数据集成平台作为源启数据资产平台的重要组成部分,专注于实现跨源数据的高效汇聚与迁移,提供一站式数据集成服务。平台适用于银行、保险、证券、能源、制造等行业,能够实现对多源异构数据从采集、转换到写入的全…