专做英文类网站做编程网站有哪些内容

news/2025/9/23 10:58:43/文章来源:
专做英文类网站,做编程网站有哪些内容,简述网站开发的工作流程,无锡网站推广哪家好一、命令行解释器shell的原理 我们已经知道Linux给我们提供了一系列由exec开头的系统调用接口#xff0c;可以让我们在自己所写的程序中调用各种指令或者我们自己写的其他程序#xff1a; 而我们的shell命令行解释器也是接收用户输入的指令#xff0c;然后执行#xff1a;…一、命令行解释器shell的原理 我们已经知道Linux给我们提供了一系列由exec开头的系统调用接口可以让我们在自己所写的程序中调用各种指令或者我们自己写的其他程序 而我们的shell命令行解释器也是接收用户输入的指令然后执行 那我们在自己所写的程序中执行一次指令是不是就类似于一个只执行了一次的shell 而如果我们自己写一个程序可以不断地接收用户输入的指令并执行那是不是就等价于一个简易的shell 所以命令行解释器shell的原理其实就是一个死循环程序它不断地接收用户输入的指令并执行对应的程序直到用户退出shell。 二、先搭好大致的框架 1、先获取用户信息并打印出提示符 既然要模拟式下一个shell那我们也要模拟的像点样子我们平时在shell命令行中打印命令的时候在命令的前面都有一个长长的提示符 这个长长的提示符主要是提示一些用户的信息包括用户名和主机名和当前所在的工作目录。 那我们也需要先获取一下。 这些用户名、主机名和工作目录其实都是一些环境变量所以我们可以通过getenv系统调用获得 而用户名这些信息其实在系统的环境变量中都有 所以要打印出这些信息其实并不难我们直接在环境变量中获取就行了 效果也是如预料之中的 2、获取用户输入指令并分割成字符串数组 解决打印提示符的工作接下来就应该接收用户输入的命令了需要注意的是我们平时在命令行中输入各种指令的时候例如“ls -a -l”都是会带一些空格的。所以我们不能直接使用scanf接收因为scanf是默认遇到空格就结束的了所以scanf最多只能接收到第一个ls。 所以我们就要使用另一个更适合的接口——fgets 它的功能其实就是从一个输入流中读取数据写入一个缓冲区中我们可以从stdin(键盘)中读取数据然后定义一个字符串将数据保存到字符串中 其结果也是符合我们的预期的 获取完用户输入的指令之后我们要有干什么呢 我们最后的目的是要执行指令的啊我们先来考虑一下我们该使用哪一个程序题换接口才更方便呢 因为我们现在是在自己写的程序里面去执行指令而程序并不知道我们所输入的指令的路径在哪里所以我们肯定是选择自带路径的即带‘p’的。而可变参数列表又只适用于手动传参所以我们可能也得选择带‘v’的。 所以最优的选择就是 所以这就需要我们将用户输入的字符串以空格为分隔符分割进一个字符串数组中。 而C语言也有这样的接口能让我们对一个字符串以一个分隔符分割然后放入到一个字符数组中那就是strtok 现在来回一下这个strtok的第一次使用和后面的使用是不一样的第一次使用我们需要传递的是字符串数组的起始位置而之后传递就只需要传第一个NULL即可。 因为strtok一旦失败就返回NULL所以我们可以像下面这样写 运行结果 3、执行指令 有了上面的准备工作我们就终于可以来执行指令了。 我们观察到在shell中执行一个指令后其实是执行完就退出了的 既然是执行完就退出那我们就肯定不能让我们的父进程执行而是应该让子进程来执行子进程执行完就直接退出而父进程则负责回收子进程 运行结果 所以我们现在就成功的调用到了我们系统的指令了而现在它只执行了一次我们只需要将之前所写的逻辑放入到一个死循环中就可以让我们自定义的shell一直运行了 运行结果 至此我们自定义shell的雏型也就完成了它可以执行很多我们系统的指令也不会退出已经满足了shell命令行的大部分功能了。 但还有一些指令是现阶段的myshell不能完成的比如我们可以试着运行一下cd命令 我们会发现myshell在执行完cd命令后路径并没有发生改变也就是说不能完成cd的任务。 这是因为像cd这样的命令它是一个“内建命令”。 三、处理“内建命令” 1、什么是内建命令 在Linux中有一些命令是一定要父进程来执行的不能由子进程来执行这些命令就被称为“内建命令”。 就拿上面所提到的“cd”命令来说它的本质是程序的工作目录发生了改变之后执行任何指令都是在这个工作目录下执行。那它就必定不能交给子进程来执行因为子进程一执行就退了所以就算子进程的工作目录改变了也没用。 所以cd命令一定要是父进程执行。 Linux中其实有很多的内建命令今天我们实现的是一个简易的shell所以我这里只实现三个cd、exportecho。 2、cd 执行cd命令是改变当前程序的工作目录所以我们先要来认识一个接口 这个接口就是用来改变当前进程的工作目录的谁调用chdir谁的工作目录就发生改变。 所以我们要做的就是让父进程来调用这个chdir。 我们可以封装一个函数来判断当前命令是否是内建命令如果是则执行并返回1如果不是则返回0。 然后我们在创建子进程之前先判断一下就行了 之后我们的cd内建命令就可以正常执行了 但是这里还有一个问题也就是虽然我们工作目录的确是改变了但是我们提示符里面的工作目录却并没有改变 原因在于我们在打印提示符的时候获取的工作目录实在环境变量里获取的 而我们这里只是改变了工作目录并没有对环境变量做更改所以它每一次获取到的都是一样的。 如果想要让提示符内的路径也发生改变那我们还得要先认识一个接口 这个接口的作用就是将当前进程所在的绝对路径获取并放入一个缓冲区内。 所以我们可以创建一个全局的cwd每次改变path的时候就获取一次当前进程的绝对路径然后将获取到的路径放入cwd中然后再将cwd导入到系统的环境变量表中 做完这些工作之后我们提示符里面的路径就也会发生改变了 为什么cwd一定要用全局变量呢这是因为环境变量的获取一定要有一个源头如果cwd只是局部变量那么子进程一退出局部变量就被销毁了。那我们之后再查询env的时候就查不到对应的环境变量了。 4、export 就像上面所说到的环境变量在查询的时候一定要有一个“源头”所以我们要导出的环境变量就一定不能存储在一个临时的空间里面。 所以我们要为我们写的myshell创建一个全局的环境变量表 然后我们在导入环境变量的同时把要导入的环境变量加入到我们创建的环境变量表中即可 这样我们导的环境变量就不会消失了而且也能导入多个 3、echo 这个echo就有很多情况要分了如果echo后面跟的是“$一个环境变量”我们需要去环境变量表中查询出这个环境变量然后打印出来如果后面跟的是一个字符串那我们直接打印出这个字符串即可而如果我们后面跟的是“$?”那我们要打印的是最近一个程序结束时的退出码这个也是我们等下需要特殊处理的东西。 打印字符串或者打印环境变量其实很好处理如果是字符串那我们就直接打印好了如果是环境变量那我们就用getenv获取后再打印出来 运行结果 对于退出码我们可以创建一个全局的变量latcode默认设为0然后在每次子进程结束后父进程使用waitpid回收子进程的状态时将lastcode赋值即可 运行结果 四、整体代码 #include stdio.h #include stdlib.h #include string.h #include sys/wait.h #include unistd.h #include sys/types.hchar enval[100][100]; int env_num 0; int lastcode 0; // 记录最近一个进程退出是的退出码默认为0char cwd[1024]; const char* getUserName() {const char *username getenv(USER);if (username) {return username;}return none; }const char* getHostName() {const char* hostname getenv(HOSTNAME);if (hostname) {return hostname;}return none; }const char* getPwd() {const char* pwd getenv(PWD);if (pwd) {return pwd;}return none; } // 处理内建命令 // 成功执行返回1失败返回0 int dobuildin(char *argv[]) {if (strcmp(argv[0], cd) 0) {char *path NULL;if (NULL argv[0]) {// 如果后面没有跟路径就让路径默认为.即当前目录path .;} else {path argv[1];}chdir(path);// 获取当前进程的绝对路径char temp[1024];getcwd(temp, sizeof(temp));// 将temp写入cwd中sprintf(cwd, PWD%s, temp);// 将cwd中的环境变量导入到系统的环境变量表中putenv(cwd);return 1;} else if (strcmp(argv[0], export) 0) {if (argv[1] NULL) {return 1;}strcpy(enval[env_num], argv[1]);putenv(enval[env_num]); // 注意这里要导入的是enval[env_num]而不能是argv[1]env_num;return 1;} else if (strcmp(argv[0], echo) 0) {if (argv[1] NULL) {printf(\n);return 1;}if (argv[1][0] $ strlen(argv[1]) 1) {if (argv[1][1] ?) {// 打印上一个进程的退出码printf(%d\n, lastcode);// 因为内建命令执行时总是成功的所以这里直接将lastcode设成0就行lastcode 0; } else {// 打印环境变量char *val argv[1] 1;char *reval getenv(val);if (reval NULL) {printf(\n);return 1;}printf(%s\n, reval);}} else {// 表示是字符串printf(%s\n, argv[1]);}return 1;}return 0;}int main() {char usercommand[1024];while (1) {char *argv[100] { NULL };int argc 0;printf([%s%s %s] , getUserName(), getHostName(), getPwd());char *r fgets(usercommand, sizeof(usercommand), stdin);if (NULL r || strlen(usercommand) 0) {continue;}usercommand[strlen(usercommand) - 1] \0;// 分割用户输入的指令argv[argc] strtok(usercommand, );while (argv[argc] strtok(NULL, ));// 检查是否是内建命令并执行int res dobuildin(argv);if (res) {continue; // 如果成功执行就不用再往后执行了}// 执行指令pid_t id fork();if (0 id) {// childint n execvp(argv[0], argv);if (-1 n) {printf(-myShell: %s: command not found\n, argv[0]);}exit(1);} else {// fatherint status 0;pid_t rid waitpid(id, status, 0);if (rid 0) {lastcode WEXITSTATUS(status);} else {return -1;}}}return 0; }

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

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

相关文章

无人机、人形机器人 —— 电池电压(电量)对运行状态的影响

无人机、人形机器人 —— 电池电压(电量)对运行状态的影响某无人机设备,正常工作电压3.3V,当电源电力不足时其电压会降低到3.3V以下,而在此种情况下电机的工作处于非正常状态(电机的运行状态,转速等不在飞控软件…

若依前后端版本-综合QA

若依前后端版本-综合QA一 环境信息 二 说明 主要记录研发过程过程中遇到的问题及解决办法 问题背景,报错信息、解决办法 三 问题 3.1 找不到符号 符号: 类 SpringBootApplication 3.1.1 问题背景及报错信息 添加新模…

tests-stats/regression.sh

1.@是一个特殊的索引,用于表示数组中的所有元素。 ${dir_array[@]}shell中数组展开的语法,表示数组 dir_array 中的所有元素。 2.$(printf "%s\n" "${dir_array[@]}" | grep "softmax"…

光隔离探头技术解析:高电压测量的安全革命​​

光隔离探头通过光电转换实现高压安全测量,具备高共模抑制、强隔离和低噪声,革新高压信号测量技术。在电力电子、新能源及工业驱动领域,工程师们面临着一个日益严峻的挑战:如何安全、精确地测量悬浮在数百甚至数千伏…

freertos.c解析 - 教程

freertos.c解析 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

北京网站建设哪家最好网站建设验收确认书免费下载

本节内容为2020年下半年小学教师资格证考试科目二《教育教学知识与能力》小学课堂教学导入考点详解。【考点:小学课堂教学导入】一、课堂教学导入概述(一)教学导入的概念所谓教学导入,是指在上课之初,教师利用几分钟的时间,运用简洁的言语或行为,将学生的注意力吸引…

网站建设调研文档知名的产品设计网站

前言 HTTP/1.1 是目前广泛应用的网络协议之一,虽然已经存在多年,但我们仍然可以通过优化来提升其性能和效率。本文将从优化思路的角度出发,探讨如何在 HTTP/1.1 协议下实现优化,包括避免发送重复 HTTP 请求、减少 HTTP 请求次数、…

微型网站 源码注册德国网站域名

B站:啥都会一点的研究生公众号:啥都会一点的研究生 前言 YOLOv10 由清华大学研究人员在 Ultralytics版基础上进行进一步开发,引入了一种新的实时目标检测方法,解决了以前版本 YOLO 在后处理和模型架构方面的不足。通过消除非最大…

网站ip地址范围上海网站建设公司怎么分辨好坏

问题描述 最近碰到一个奇怪的问题,DS 创建工作流成功,但是一旦执行,始终在转,而且没有任何执行的痕迹,后来到数据库一查发现压根没创建任务实例。 我们都知道一个工作流里面可以挂多个任务节点,执行工作流…

天行健公司网站建设宁波网站建设服务公司电话

字符串的声明字符串是内存中连续排列的0个或多个字符。不变字符串是指字符串一旦创建,其内容就不能改变,Java中使用String类来处理不变字符串,在对String类的实例进行查找、比较、拼接等操作时,既不能输入新字符,又不能…

建设刷单网站铁路建设网站多少

日前价格预测 预测说明: 如上图所示,预测明日(2023-12-14)山西电力市场全天平均日前电价为491.16元/MWh。其中,最高日前电价为804.44元/MWh,预计出现在16:15。最低日前电价为336.28元/MWh,预计…

网站简繁体转换.rar商务网站开发实训体会

JDK 13已于2019年9月17日上线GA, 此处列出了重要的新功能。 新功能之一是“文本块”。 这样可以轻松地编写多行字符串,而不必在拆分成不同的行时进行串联。 让我们快速了解创建多行字符串的不同方法: String aBlock """ SE…

网站建设公司86215河南专业网站建设开发团队

LabVIEW 中调用动态库接口时,如果是值传递的结构体,可以根据字段拆解为多个参数;如果参数为结构体指针,可用簇(Cluster)来匹配,其内存连续相当于单字节对齐。 1.值传递 接口定义: …

从缺陷管理到质量协作:现代Bug工具的范式升级

从缺陷管理到质量协作:现代Bug工具的范式升级 在持续交付成为标配的今天,传统Bug跟踪系统正面临前所未有的挑战。最新行业调研显示,67%的研发团队认为现有缺陷管理工具与DevOps工作流存在明显断层,这促使新一代协作…

【html组件】简易漫画阅读器

【html组件】简易漫画阅读器<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge&…

21 C++ 哈希表入门:unordered_set/unordered_map 用法 + 与 set/map 性能 / 迭代器差异全解 - 教程

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

ubuntu安装mysql2

# 1. 更新系统包列表 sudo apt update# 2. 安装 MySQL 服务器 sudo apt install mysql-server -y# 3. 启动 MySQL 服务并设置开机自启 sudo apt install mysql-server -y sudo systemctl enable mysql# 4. 验证 MySQL …

生鲜电商网站建设策划书重庆市网站建设

刚开始看到这个功能的时候一定觉得so easy&#xff0c;开始的时候我也是这么觉得的&#xff0c;这还不简单&#xff0c;然而真正写的时候才发现并没有想象的那么简单。 先上图&#xff0c;不上图你们都不想看&#xff0c;我难啊&#xff0c;到Github&#xff1a; https://gith…

学校网站建设的建议上海高品质网站建设

01 河道周围垃圾堆放 场景描述&#xff1a;基于河道漂浮物容易通过水流的影响&#xff0c;被推在河道周围的岸边&#xff0c;因此通过对河道周围的垃圾堆放24h实时识别&#xff0c;目的提高治理河道垃圾的时效性且减少环保工人的工作量 适用场所&#xff1a;适用白天或夜间光…

网站推广方法汇总苏州沧浪做网站哪家好

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9866068.html在本文中&#xff0c;我将解释命令模式&#xff0c;以及如何利用基于命令模式的第三方库来实现它们&#xff0c;以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此…