在Linux环境下模拟实现命令解释器用c语言实现mypwd「粉丝答疑」

粉丝提问

Solution

要在 Linux 环境下用 C 语言模拟实现一个命令解释器,包含mypwd, mymkdir, myrmdir, mycd, mylist, mycp, mydate, mycreate, mydelete, exit等基本命令,需要按照以下步骤进行:

  1. 理解每个命令的功能

    • mypwd: 显示当前工作目录。
    • mymkdir: 创建一个新目录。
    • myrmdir: 删除一个空目录。
    • mycd: 更改当前工作目录。
    • mylist: 列出目录中的文件和子目录。
    • mycp: 复制文件或目录。
    • mydate: 显示或设置系统日期和时间。
    • mycreate: 创建一个新文件。
    • mydelete: 删除一个文件。
    • exit: 退出命令解释器。
  2. 设置基本框架

    • 创建一个循环,接收用户输入的命令。
    • 解析命令,确定要执行的操作。
  3. 实现各个命令

    • 使用C语言的标准库函数和系统调用来实现每个命令。
  4. 添加错误处理和注释

    • 确保每个命令都有适当的错误处理。
    • 添加注释以解释代码的功能。
  5. 测试

    • 对每个命令进行测试,确保它们按预期工作。

1. 基本框架

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>int main() {char command[256];while (1) {printf("myprompt> ");fgets(command, 256, stdin);command[strcspn(command, "\n")] = 0; // Remove newline characterif (strcmp(command, "exit") == 0) {break;}// 解析和执行命令...}return 0;
}

2. 实现mypwd

void mypwd() {char cwd[1024];if (getcwd(cwd, sizeof(cwd)) != NULL) {printf("%s\n", cwd);} else {perror("mypwd failed");}
}

类似实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>void mypwd() {char cwd[1024];if (getcwd(cwd, sizeof(cwd)) != NULL) {printf("%s\n", cwd);} else {perror("mypwd failed");}
}void mymkdir(const char *dirname) {if (mkdir(dirname, 0755) == -1) {perror("mymkdir failed");}
}void myrmdir(const char *dirname) {if (rmdir(dirname) == -1) {perror("myrmdir failed");}
}void mycd(const char *path) {if (chdir(path) == -1) {perror("mycd failed");}
}void mylist(const char *path) {DIR *d;struct dirent *dir;d = opendir(path);if (d) {while ((dir = readdir(d)) != NULL) {printf("%s\n", dir->d_name);}closedir(d);} else {perror("mylist failed");}
}void mycp(const char *source, const char *destination) {// 这里的实现非常简单,不处理目录复制,只适用于文件char ch;FILE *sourceFile, *targetFile;sourceFile = fopen(source, "r");if (sourceFile == NULL) {perror("Error opening source file");exit(EXIT_FAILURE);}targetFile = fopen(destination, "w");if (targetFile == NULL) {fclose(sourceFile);perror("Error opening target file");exit(EXIT_FAILURE);}while ((ch = fgetc(sourceFile)) != EOF) {fputc(ch, targetFile);}printf("File copied successfully.\n");fclose(sourceFile);fclose(targetFile);
}void mydate() {time_t t = time(NULL);struct tm *tm = localtime(&t);printf("%s", asctime(tm));
}void mycreate(const char *filename) {FILE *fp = fopen(filename, "w");if (fp) {printf("File created successfully.\n");fclose(fp);} else {perror("mycreate failed");}
}void mydelete(const char *filename) {if (remove(filename) == -1) {perror("mydelete failed");} else {printf("File deleted successfully.\n");}
}int main() {char command[256];char arg1[256];char arg2[256];while (1) {printf("myprompt> ");scanf("%s", command);if (strcmp(command, "exit") == 0) {break;} else if (strcmp(command, "mypwd") == 0) {mypwd();} else if (strcmp(command, "mymkdir") == 0) {scanf("%s", arg1);mymkdir(arg1);} else if (strcmp(command, "myrmdir") == 0) {scanf("%s", arg1);myrmdir(arg1);} else if (strcmp(command, "mycd") == 0) {scanf("%s", arg1);mycd(arg1);} else if (strcmp(command, "mylist") == 0) {scanf("%s", arg1);mylist(arg1);} else if (strcmp(command, "mycp") == 0) {scanf("%s %s", arg1, arg2);mycp(arg1, arg2);} else if (strcmp(command, "mydate") == 0) {mydate();} else if (strcmp(command, "mycreate") == 0) {scanf("%s", arg1);mycreate(arg1);} else if (strcmp(command, "mydelete") == 0) {scanf("%s", arg1);mydelete(arg1);}}return 0;
}

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

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

相关文章

SQL---Zeppeline前驱记录与后驱记录查询

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

RTP/RTCP/RTSP/SIP/SDP/RTMP对比

RTP&#xff08;Real-time Transport Protocol&#xff09;是一种用于实时传输音频和视频数据的协议。它位于传输层和应用层之间&#xff0c;主要负责对媒体数据进行分包、传输和定时。 RTCP&#xff08;Real-Time Control Protocol&#xff09;是 RTP 的控制协议&#xff0c;…

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…

Windows 系统彻底卸载 SQL Server 通用方法

Windows 系统彻底卸载 SQL Server 通用方法 无论什么时候&#xff0c;SQL Server 的安装和卸载都是一件让我们头疼的事情。因为不管是 SQL Server 还是 MySQL 的数据库&#xff0c;当我们在使用数据库时因为未知原因出现问题&#xff0c;想要卸载重装时&#xff0c;如果数据库…

vue element plus 管理系统路由菜单简要设计(后端获取菜单)

1 需求 管理系统“菜单”由后端接口返回&#xff0c;前端需要根据后端返回的“菜单”数组&#xff0c;构造路由&#xff0c;渲染侧栏菜单有些菜单是子菜单&#xff0c;有对应的路由&#xff0c;但是不在侧栏显示&#xff08;比如一些详情页面&#xff09; 注&#xff1a;这里的…

Asp.Net Core 项目中常见中间件调用顺序

常用的 AspNetCore 项目中间件有这些&#xff0c;调用顺序如下图所示&#xff1a; 最后的 Endpoint 就是最终生成响应的中间件。 Configure调用如下&#xff1a; public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseD…

LIGA-Stereo:为基于立体 3D 检测器的学习 LiDAR 几何感知表示

论文地址&#xff1a;https://openaccess.thecvf.com/content/ICCV2021/papers/Guo_LIGA-Stereo_Learning_LiDAR_Geometry_Aware_Representations_for_Stereo-Based_3D_Detector_ICCV_2021_paper.pdf 论文代码&#xff1a;https://github.com/xy-guo/LIGA-Stereo 摘要 基于立…

CloudCanal x Debezium 打造实时数据流动新范式

简述 Debezium 是一个开源的数据订阅工具&#xff0c;主要功能为捕获数据库变更事件发送到 Kafka。 CloudCanal 近期实现了从 Kafka 消费 Debezium 格式数据&#xff0c;将其 同步到 StarRocks、Doris、Elasticsearch、MongoDB、ClickHouse 等 12 种数据库和数仓&#xff0c;…

js 图片 手动上传,并回显

效果展示&#xff1a; 代码&#xff1a; <label for"avatarUpload"><div><img v-if"avatatImageUrl" :src"avatatImageUrl" class"avatar"><img v-else src"../../assets/images/account/avatar-upload.png…

vite 引入构建分析插件

yarn add rollup-plugin-visualizer vite.config.js里配置 plugins: [copy({targets: [{ src: node_modules/echarts/dist/component/echarts.min.js, dest: public/js }]}),visualizer({// 打包完成后自动打开浏览器&#xff0c;显示产物体积报告open: true,gzipSize: true,b…

图像识别与人工智能到底是何关系?有何区别?

图像识别是人工智能领域的一个重要应用领域&#xff0c;它利用人工智能技术和算法来分析和理解图像内容。图像识别是使计算机能够模拟和理解人类视觉系统的能力&#xff0c;并从图像中提取出有用的信息和特征。 人工智能在图像识别中扮演着至关重要的角色&#xff0c;主要体现…

ruoyi若依前后端分离版部署centos7服务器(全)

目录 VMware虚拟机 centos7 安装环境如下 一、msql 5.7 二、nginx1.23.3 三、java8 四、redis 3.2.1 五、部署若依前端 六、部署若依后端 前言 虚拟机的桥接与nat模式 : 重点 重点&#xff01;&#xff01;&#xff01; 无线不可以用桥接模式 &#xff0c;而你用了nat模式会…

OpenSergo使用详解

简介 OpenSergo是一个基于微服务治理的标准和生态&#xff0c;覆盖了服务元信息、流量治理、服务容错、数据库/缓存治理、服务注册发现、配置治理等十几个关键领域&#xff0c;覆盖了完整的微服务生命周期&#xff08;从开发态到测试态&#xff0c;到发布态&#xff0c;再到运…

融云数智办公获 IT168「2023 年度信创卓越贡献奖」

近期&#xff0c;业界知名 IT 垂直门户媒体 IT168 正式揭晓其年度大型评选“2023 年技术卓越奖”结果&#xff0c;融云榜上有名。关注【融云 RongCloud】&#xff0c;了解协同办公平台更多干货。 融云数智办公作为信创领域明星产品荣获“2023 年度信创卓越贡献奖”。 复杂多变…

flink使用sql-client-defaults.yml无效

希望在flink sql脚本启动时自动选择catalog&#xff0c;减少麻烦。于是乎配置sql-client-defaults.yaml&#xff1a; catalogs:- name: hive_catalogtype: icebergcatalog-type: hiveproperty-version: 1cache-enabled: trueuri: thrift://localhost:9083client: 5warehouse: …

MySQL数据库8.0+版本部署安装

1、安装前准备 1.1、安装文件上传 以mysql-8.0.32版本为例&#xff0c;将 mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz 、my.cnf上传至/opt/software目录。 安装文件百度网盘下载地址&#xff1a; mysql-8.0.32&#xff1a;https://pan.baidu.com/s/1gtPYEa2aT0V2-1Q3-KKxl…

使用HTTP协议有哪些风险?HTTP与HTTPS的区别是什么

作为两种常见的网络协议&#xff0c;HTTP和HTTPS都是用于在浏览器和服务器之间传输数据的。然而在保障数据安全性方面&#xff0c;HTTPS远远优于HTTP。在网络安全愈发重要的当下&#xff0c;HTTP协议的不安全性使得其逐渐被淘汰弃用。那么使用HTTP协议有哪些风险呢&#xff1f;…

关于“Python”的核心知识点整理大全34

目录 第&#xff11;3 章 外星人 13.1 回顾项目 game_functions.py 13.2 创建第一个外星人 13.2.1 创建 Alien 类 alien.py 13.2.2 创建 Alien 实例 alien_invasion.py 13.2.3 让外星人出现在屏幕上 game_functions.py 13.3 创建一群外星人 13.3.1 确定一行可容纳…

使用Pycharm一键将.ui文件生成.py文件配置教程、一键打开QTDesigner教程

2df3621a-7ffd-4f18-9735-b86464b83a5b 前言 我痛恨所有将白嫖归为理所应当的猪&#x1f416;。 教程 打开pycharm之后&#xff0c;依次点击File->Settings->Tools->External Tools&#xff0c;进入如下界面&#xff1a; 1、配置快捷打开Qt Designer 点击号&…

探索鸿蒙:了解华为鸿蒙操作系统的基础课程

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习产出&#xff1a; 介绍鸿蒙操作系统的起源和发展历程。 理解鸿蒙操作系统的核心概念和体系结构。 学习如何搭建和配置鸿蒙开发环境。 掌握基础的鸿蒙应用开发技术&#xff0c;包括应用的创建、…