[Linux]简单的shell实现

news/2024/11/30 6:48:03/文章来源:https://www.cnblogs.com/wzhiheng/p/18568477

一个简单的shell实现

什么是内建命令

内建命令是由shell本身提供的命令,而不是通过外部程序(如位于/bin/usr/bin等目录下的可执行文件)来执行的命令。这些命令在shell启动的时候就加载到内存中,执行效率相对较高。

常见的内建命令有:cdpwdecho

什么是当前路径

本质就是进程的工作目录,默认是进程在哪个目录底下执行,它的工作目录就是这个目录。

那这个工作目录可以更改吗?答案是可以的,使用chdir()函数就可以更改当前进程的工作目录。

在我们自己实现一个简单的shell,执行cd命令的时候,你会发现路径没有变化。那是因为在执行命令的时候,我们是使用fork()出来的子进程来执行的cd,子进程有自己的工作目录(一般和父进程的工作目录相同),当执行cd的时候,更改的是子进程的目录,子进程执行完毕,什么都没了,继续用的是父进程,即shell。

简单的shell实现

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>#define NUM 1024
#define OP_NUM 64char command[NUM];
char *myargv[OP_NUM];
int lastCode = 0;
int lastSig = 0;int main()
{while (1){char *user = getenv("USER");char *host = getenv("HOSTNAME");printf("%s@%s 当前路径#", user, host);fflush(stdout);char *s = fgets(command, sizeof(command) -1, stdin);//获取命令行的输入assert(s != NULL);(void)s;//清除用户按下的回车command[strlen(command) - 1] = 0;//字符串切割myargv[0] = strtok(command, " ");int i = 1;//显示颜色if (myargv[0] != NULL && strcmp(myargv[0], "ls") == 0) {myargv[i++] = (char*)"--color=auto";}//myargv[] 必须以NULL结尾,而strtok函数结束的时候返回NULL//strtok()中的NULL表示从上次结束的位置继续查找下一个子串while (myargv[i++] = strtok(NULL, " ")) {}//不需要创建子进程,让shell自己执行对应的命令if (myargv[0] != NULL && strcmp(myargv[0], "cd") == 0){if (myargv[1] != NULL) chdir(myargv[1]);continue;}if (myargv[0] != NULL && myargv[1] != NULL && strcmp(myargv[0], "echo") == 0){if (strcmp(myargv[1], "$?") == 0) printf("%d, %d\n", lastCode, lastSig);else printf("%s\n", myargv[1]);continue;}//创建子进程pid_t id = fork();assert(id != -1);if (id == 0){//程序替换execvp(myargv[0], myargv);exit(1);}int status = 0;pid_t ret = waitpid(id, &status, 0);assert(ret > 0);(void)ret;lastCode = WEXITSTATUS(status);lastSig = WIFEXITED(status);}
}

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

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

相关文章

敏捷开发:Sprint Planning 冲刺计划会议详细介绍和用户故事拆分、开发任务细分

Sprint Planning 冲刺计划会议简介 Sprint Planning (冲刺计划会议),又叫规划会议。此会议通过 Scrum 团队的集体沟通讨论,确定接下来的 Sprint 中要完成的待开发项,把它们组成一个 Sprint Backlog。这些待开发项都是从 Product Backlog 中挑选的。Product Backlog:产品功…

jmeter之性能测试(16.1)

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 2、性能测试的时间? 在功能测试完成后才能进行性能测试…

高级语言程序设计作业 11/25

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13311 学号:102400215 姓名:胡加乘14.17 复习题 3 struct month {const char* name; // 月份名const char abbr[4];…

【红队】windows立足点建立技术

本文涵盖了将PowerShell-Empire设置为C2服务器的过程,以及如何生成可用于在目标系统上获得初步立足点的宏Excel文档。 ATT& CK 初始访问包括使用各种进入向量在网络中获得其初始立足点的技术。用于获得立足点的技术包括有针对性的鱼叉式网络钓鱼和利用面向公众的Web服务器…

公钥加密系统与离散对数问题

概念 1 单向函数和陷门信息 单向函数是一种可逆函数,其正向计算容易,但反向计算却非常困难。 安全的公钥加密系统(Public Key Cryptosystem, 简称PKC)基于具有陷门的单向函数。陷门是一种辅助信息,利用它可以轻松计算单向函数的反函数。“陷门”一词来源于物理或机械陷阱的…

ljnljn小站上线啦

站内设有多个Web靶场以及Cyberchef,欢迎大家前来遛遛~ 地址:http://8.130.110.67/

周末基于 .NET 9 + K8S 写了个 MockHttp

MockHTTP MockHTTP 可以将现有HTTP转换成GET请求,设置cron定时调用,自定义代码去格式化数据,通知到你的邮箱里。 比如每天早上时自动获取博客园文章列表,天气下雨时通知,各类签到等 Request 创建一个请求 可以使用VSCode或VS,创建一个.http文件 POST https://www.wdora.c…

CentOS7.9无图形桌面安装chromedriver、chrome、drissionpage

由于centos7 停止维护,在安装google浏览器就因为版本和下载源的问题走了不少弯路,踩了一些坑。 原操作: sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpmyum install google-chrome-stable_current_x86_64.rpm出现错误缺少glibc_2.…

轻松掌控:免越狱iOS设备的群控与单控功能详解

在当今的数字化时代,高效管理多台iOS设备成为企业和个人用户的一项重要需求。无论是为了提高团队协作效率,还是为了执行大规模的营销活动,免越狱的iOS设备群控与单控功能都提供了强大且安全的解决方案。本章将详细介绍如何利用这些功能,轻松实现对多台iOS设备的有效管理。免…

详解“日切”原理

探索支付领域的奥秘,深入了解日切的复杂世界。在这篇文章将带我们穿越历史的长河,从早期的钱庄货币到现代银行体系,全面解析日切的演变、挑战和实现模式。我想很多人都不陌生,但日切究竟是如何实现的,日切前后及过程中都发生了什么,需要做哪些事情;不同的年代、不同的机…

Windows Server 2025激活教程

Windows Server 如何把评估版升级改为正式版本并激活微软官方并不提供server系统的正式版本,只提供测试的评估版本,那么我们怎么修改为正式版本呢?1.确认版本开始————运行————CMD(管理员模式)cmd命令页面输入:winver 会弹出版本页面 查看具体为数据中心版还是标准…