实验内容:扩充版本 0 内核,在系统启动时直接提供命令解释器功能(不运行硬盘上的命令解释器),即不断接收用户输入的命令并正确给出反馈。要求该命令解释器既支持内部命令 cd、sync、exit、cat;也支持外部命令,即可以接收 cp、vi 等命令,然后执行硬盘上相应的可执行程序。给出完整思路和完整代码

时间: 2023-11-22 15:54:09 浏览: 42
思路: 1. 在内核中加入命令解释器功能,即通过输入命令来执行对应的操作。 2. 实现内部命令:cd、sync、exit、cat 3. 实现外部命令:cp、vi,通过解析用户输入的命令来判断需要执行哪个命令。 4. 处理用户输入的命令,解析出命令名和参数,并将命令交给相应的处理函数处理。 完整代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 1024 #define MAX_ARGC 64 #define MAX_PATH 256 char cmd[MAX_LEN]; // 存放用户输入的命令 char path[MAX_PATH]; // 存放当前路径 // 内部命令处理函数 int cd(char *argv[]); int sync(); int exit_shell(); int cat(char *argv[]); // 外部命令处理函数 int cp(char *argv[]); int vi(char *argv[]); // 命令处理函数数组 struct command { char *name; int (*func)(char *[]); } commands[] = { {"cd", cd}, {"sync", sync}, {"exit", exit_shell}, {"cat", cat}, {"cp", cp}, {"vi", vi}, {NULL, NULL} }; // 解析用户输入的命令 int parse_command(char *cmd, char *argv[]) { int argc = 0; char *p = strtok(cmd, " "); while (p != NULL && argc < MAX_ARGC - 1) { argv[argc++] = p; p = strtok(NULL, " "); } argv[argc] = NULL; return argc; } // 查找命令处理函数 int find_command(char *name, struct command commands[]) { for (int i = 0; commands[i].name != NULL; i++) { if (strcmp(name, commands[i].name) == 0) { return i; } } return -1; } // 执行命令 int execute_command(char *cmd) { char *argv[MAX_ARGC]; int argc = parse_command(cmd, argv); if (argc == 0) { return 0; } int index = find_command(argv[0], commands); if (index == -1) { printf("%s: command not found\n", argv[0]); return -1; } return commands[index].func(argv); } // 内部命令处理函数:cd int cd(char *argv[]) { if (argv[1] == NULL) { printf("usage: cd path\n"); return -1; } if (chdir(argv[1]) == -1) { printf("cd: %s: No such file or directory\n", argv[1]); return -1; } getcwd(path, MAX_PATH); return 0; } // 内部命令处理函数:sync int sync() { printf("sync\n"); return 0; } // 内部命令处理函数:exit int exit_shell() { printf("exit\n"); exit(0); } // 内部命令处理函数:cat int cat(char *argv[]) { if (argv[1] == NULL) { printf("usage: cat file\n"); return -1; } FILE *fp = fopen(argv[1], "r"); if (fp == NULL) { printf("cat: %s: No such file or directory\n", argv[1]); return -1; } char buf[MAX_LEN]; while (fgets(buf, MAX_LEN, fp) != NULL) { printf("%s", buf); } fclose(fp); return 0; } // 外部命令处理函数:cp int cp(char *argv[]) { if (argv[1] == NULL || argv[2] == NULL) { printf("usage: cp src_file dest_file\n"); return -1; } FILE *src_fp = fopen(argv[1], "r"); if (src_fp == NULL) { printf("cp: %s: No such file or directory\n", argv[1]); return -1; } FILE *dest_fp = fopen(argv[2], "w"); if (dest_fp == NULL) { printf("cp: %s: No such file or directory\n", argv[2]); return -1; } char buf[MAX_LEN]; while (fgets(buf, MAX_LEN, src_fp) != NULL) { fprintf(dest_fp, "%s", buf); } fclose(src_fp); fclose(dest_fp); return 0; } // 外部命令处理函数:vi int vi(char *argv[]) { printf("vi: not implemented yet\n"); return 0; } int main() { getcwd(path, MAX_PATH); // 获取当前路径 printf("Welcome to ChitShell!\n"); while (1) { printf("%s $ ", path); fgets(cmd, MAX_LEN, stdin); if (strlen(cmd) > 0 && cmd[strlen(cmd) - 1] == '\n') { cmd[strlen(cmd) - 1] = '\0'; // 去掉换行符 } execute_command(cmd); } return 0; } ```

相关推荐

最新推荐

recommend-type

编译原理实验报告(PL/0语言功能扩充)

自己总结的编译原理的实验报告,主要是PL/0语言C语言版的功能扩充,还有测试用例。心得及感想。操作步骤。
recommend-type

python opencv 实现对图像边缘扩充

今天小编就为大家分享一篇python opencv 实现对图像边缘扩充,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

JavaWeb设计失物招领系统(报告书)

通过表现逻辑与业务逻辑的分离,使网页内容简洁,系统的可维护性和可扩充性增强。在服务器端,系统使用JDBC中间件访问数据库,数据库服务器定义了本系统所需要的事务逻辑和数据逻辑。本系统使用JSP技术作为表现手段...
recommend-type

ZF-008 USB多功能编程器

4、 升级方便,智峰软件会不断扩充它的功能,为用户提供升级固件 5、 强大的上位机软件支持-- progisp1.68 6、 支持isp方式编程,既可做高压编程器用也可做isp方式的下载线用 7、 体积小巧携带方便 8、 计划支持pic...
recommend-type

用java做的新闻网站设计实现(包含后台管理系统)

此网站利用JAVA语言编写的,并采用Myeclipse10.6开发工具编写而成的。...为了保证系统的安全性,在用户登录系统设计时,用户需输入正确的工号和用户口令才能进入系统,并且不同的身份的用户具有不同的权限
recommend-type

电容式触摸按键设计参考

"电容式触摸按键设计参考 - 触摸感应按键设计指南" 本文档是Infineon Technologies的Application Note AN64846,主要针对电容式触摸感应(CAPSENSE™)技术,旨在为初次接触CAPSENSE™解决方案的硬件设计师提供指导。文档覆盖了从基础技术理解到实际设计考虑的多个方面,包括电路图设计、布局以及电磁干扰(EMI)的管理。此外,它还帮助用户选择适合自己应用的合适设备,并提供了CAPSENSE™设计的相关资源。 文档的目标受众是使用或对使用CAPSENSE™设备感兴趣的用户。CAPSENSE™技术是一种基于电容原理的触控技术,通过检测人体与传感器间的电容变化来识别触摸事件,常用于无物理按键的现代电子设备中,如智能手机、家电和工业控制面板。 在文档中,读者将了解到CAPSENSE™技术的基本工作原理,以及在设计过程中需要注意的关键因素。例如,设计时要考虑传感器的灵敏度、噪声抑制、抗干扰能力,以及如何优化电路布局以减少EMI的影响。同时,文档还涵盖了器件选择的指导,帮助用户根据应用需求挑选合适的CAPSENSE™芯片。 此外,为了辅助设计,Infineon提供了专门针对CAPSENSE™设备家族的设计指南,这些指南通常包含更详细的技术规格、设计实例和实用工具。对于寻求代码示例的开发者,可以通过Infineon的在线代码示例网页获取不断更新的PSoC™代码库,也可以通过视频培训库深入学习。 文档的目录通常会包含各个主题的章节,如理论介绍、设计流程、器件选型、硬件实施、软件配置以及故障排查等,这些章节将逐步引导读者完成一个完整的CAPSENSE™触摸按键设计项目。 通过这份指南,工程师不仅可以掌握CAPSENSE™技术的基础,还能获得实践经验,从而有效地开发出稳定、可靠的触摸感应按键系统。对于那些希望提升产品用户体验,采用先进触控技术的设计师来说,这是一份非常有价值的参考资料。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB函数调用中的调试技巧大揭秘,快速定位并解决函数调用问题

![MATLAB函数调用中的调试技巧大揭秘,快速定位并解决函数调用问题](https://ucc.alicdn.com/pic/developer-ecology/ovk2h427k2sfg_f0d4104ac212436a93f2cc1524c4512e.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB函数调用的基本原理** MATLAB函数调用是通过`function`关键字定义的,其语法为: ```matlab function [output1, output2, ..., outputN] = function_na
recommend-type

LDMIA r0!,{r4 - r11}

LDMIA是ARM汇编语言中的一条指令,用于从内存中加载多个寄存器的值。具体来说,LDMIA r0!,{r4 r11}的意思是从内存地址r0开始,连续加载r4到r11这8个寄存器的值[^1]。 下面是一个示例代码,演示了如何使用LDMIA指令加载寄器的值: ```assembly LDMIA r0!, {r4-r11} ;从内存地址r0开始,连续加载r4到r11这8个寄存器的值 ``` 在这个示例中,LDMIA指令将会从内存地址r0开始,依次将内存中的值加载到r4、r5、r6、r7、r8、r9、r10和r11这8个寄存器中。
recommend-type

西门子MES-系统规划建议书(共83页).docx

"西门子MES系统规划建议书是一份详细的文档,涵盖了西门子在MES(制造执行系统)领域的专业见解和规划建议。文档由西门子工业自动化业务部旗下的SISW(西门子工业软件)提供,该部门是全球PLM(产品生命周期管理)软件和SIMATIC IT软件的主要供应商。文档可能包含了 MES系统如何连接企业级管理系统与生产过程,以及如何优化生产过程中的各项活动。此外,文档还提及了西门子工业业务领域的概况,强调其在环保技术和工业解决方案方面的领导地位。" 西门子MES系统是工业自动化的重要组成部分,它扮演着生产过程管理和优化的角色。通过集成的解决方案,MES能够提供实时的生产信息,确保制造流程的高效性和透明度。MES系统规划建议书可能会涉及以下几个关键知识点: 1. **MES系统概述**:MES系统连接ERP(企业资源计划)和底层控制系统,提供生产订单管理、设备监控、质量控制、物料跟踪等功能,以确保制造过程的精益化。 2. **西门子SIMATIC IT**:作为西门子的MES平台,SIMATIC IT提供了广泛的模块化功能,适应不同行业的生产需求,支持离散制造业、流程工业以及混合型生产环境。 3. **产品生命周期管理(PLM)**:PLM软件用于管理产品的全生命周期,从概念设计到报废,强调协作和创新。SISW提供的PLM解决方案可能包括CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAE(计算机辅助工程)等工具。 4. **工业自动化**:西门子工业自动化业务部提供自动化系统、控制器和软件,提升制造业的效率和灵活性,包括生产线自动化、过程自动化和系统整体解决方案。 5. **全球市场表现**:SISW在全球范围内拥有大量客户,包括许多世界500强企业,表明其解决方案在业界的广泛应用和认可。 6. **中国及亚洲市场**:SISW在中国和亚洲其他新兴市场具有领先地位,特别是在CAD领域,反映了其在这些地区的重要影响力。 7. **案例研究**:文档可能包含实际案例,如通用汽车的全球产品开发项目,展示SISW技术在大型复杂项目中的应用能力。 这份建议书不仅对理解西门子MES系统有重要作用,也为企业在选择和实施MES系统时提供了策略性指导,有助于企业规划和优化其生产流程,实现更高效的制造业运营。