简单模拟实现shell(Linux)

目录​​​​​​​

前言

展示效果

实现代码 


前言

该代码模拟了shell的实现,也就是解析类似于“ls -a -l"的命令,当我们启动我们自己写的shell的可执行程序时,我们输入"ls"的命令,也可以展示出在shell中输入"ls"时同样的效果,一下为展示效果

展示效果

当我们在系统的shell下输入"ls"时,会显示 

以下代码是我自主模拟实现shell的程序执行"ls"命令时的情况  

是不是很类似呢,感兴趣的同学可以看看以下代码,自己也模仿模仿哦ε=ε=ε=(~ ̄▽ ̄)~ 

实现代码 

#include <stdio.h>
#include <string.h>
#include <unistd.h>//sleep函数//wait函数头文件
#include <sys/types.h>
#include <sys/wait.h>//exit的函数
#include <stdlib.h>#define NUM 2024
#define SIZE 100
#define SEP " "
//注意是"",而不是''.因为strtok的参数是char*类型int main()
{//0.shell或者软件,只要启动了,使用者不去终止,就始终不能停止,因此要一个死循环while (1){//1.打印类似于shell命令行前的 [xkjtx@locathost shell@] 的信息printf("[xkjtx@locatehost myshell]# ");//不要换行,否则就不像shell了,用fflush去刷新缓冲区,避免没有'\n'而导致的不输出"[xkjtx@locatehost myshell]# "的问题(我在《制作进度条》的那篇博客讲过)fflush(stdout);//2.获取命令行char cmd_line[NUM];//可以定义为全局变量,注意每次使用前memset(cmd_line, '\0', sizeof cmd_line);if (fgets(cmd_line, SIZE, stdin) == NULL)//推荐使用fgets,建立对标准输入输出流概念,方便以后学习基础IO{continue;//读取失败,重新读取}cmd_line[strlen(cmd_line) - 1] = '\0';//char* fgets(char* str, int size, FILE* stream);//如果输入成功,则返回str的起始地址,否则为NULL//3.拆分命令行char* g_argv[NUM];g_argv[0] = strtok(cmd_line, SEP);//第一次调用第一个参数传参目标字符串,后面都传NULLint index = 1;//使得ls命令时带上颜色if (strcmp(g_argv[0], "ls") == 0){g_argv[index++] = "--color=auto";}//使得ll命令也可以执行if (strcmp(g_argv[0], "ll") == 0){g_argv[0] = "ls";g_argv[index++] = "-l";g_argv[index++] = "--color=auto";}while(g_argv[index++] = strtok(NULL, SEP));// printf("index = %d\n", index);//  //检测分割是否正确// for (index = 0; g_argv[index]; index++)//C99标准不支持在for循环内定义int//   printf("g_argv[%d] = %s\n", index, g_argv[index]);//4.TODO//内置命令的处理(要父进程去执行的命令,如cd命令)//目前写法发现:cd ~, cd -, rm等命令做不了//错误写法// if (g_argv[0] == "cd")if (strcmp(g_argv[0], "cd") == 0){if (g_argv[1] != NULL)//路径合法{chdir(g_argv[1]);continue;//不去创建子进程}}//5.创建子进程//好处:不会影响父进程//shell本来就是媒婆招实习生,让实习生干活,不影响媒婆pid_t id = fork();int status = 0;if (id == 0)//child{execvp(g_argv[0], g_argv);//选这个函数的原因:(1)v:用的是数组,恰好有数组  (2)每个都要绝对路径,这是没有必要的,因此可以使用带p的函数exit(1);//进行到这里,一定是函数调用失败}//这里一定是父进程//father//获取子进程信息pid_t ret = waitpid(-1, &status, 0);/*#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);*/if (ret > 0) //等待子进程成功{printf("exit code = %d\n", WEXITSTATUS(status));//打印子进程退出码}}return 0;
}

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

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

相关文章

学习笔记——网络参考模型——TCP/IP模型(物理层)

一、TCP/IP模型-物理层 1、数据传输(交换)的形式 (1)电路交换 特点&#xff1a;通信双方独占通信链路。 优点&#xff1a;数据传输时延小&#xff0c;适用于实时通信&#xff1b;数据按序发送&#xff0c;不存在失序问题&#xff1b;适合模拟信号和数字信号传输。 缺点&am…

【前缀和】42. 接雨水

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&am…

IDEA+MyBatisX根据mapper方法自动添加注解和生成xml方法结构

前提&#xff1a;确保IDEA已安装并启用了MyBatisX插件 在service层写dao或mapper的方法结构&#xff0c;反向生成dao层方法声明&#xff0c;如下&#xff1a; void updateStock(Long skuId, Long wareId, Integer skuNum); 由于该方法传递多个参数&#xff0c;为了让MyBatis识…

心链6----开发主页以及后端数据插入(多线程并发)定时任务

心链 — 伙伴匹配系统 开发主页 信息搜索页修改 主页开发&#xff08;直接list用户&#xff09; 在后端controller层编写接口去实现显示推荐页面的功能 /*** 推荐页面* param request* return*/GetMapping("/recommend")public BaseResponse<List<User>&…

Go-知识并发控制WaitGroup

Go-知识并发控制WaitGroup 1. 认识 WaitGroup2. 基本原理2.1 信号量2.2 数据结构2.3 Add2.4 Wait2.5 Done 3. 小例子3.1 主协程等待子协程执行完成3.2 子协程等待主协程信号3.3 GetFirst 4. 总结 gitio: https://a18792721831.github.io/ 1. 认识 WaitGroup WaitGroup 是Go 应…

机器学习笔记——双线性回归 MF、 FM

双线性模型 在推荐系统领域常常使用 含义是二元函数固定一个自变量时&#xff0c;函数关于另外一个自变量是线性的。 矩阵分解模型MF 如果我们需要对一个用户推荐电影我们应该怎么推荐&#xff1f; 结合用户以及用户对电影的评分&#xff0c;可以猜测用户的偏好&#xff0c;…

Ubuntu 20.04的安装过程

在Ubuntu 20.04的安装过程中&#xff0c;需要遵循一系列步骤确保系统正确无误地配置和启动。下面将详细介绍Ubuntu 20.04的安装过程&#xff1a; 准备工作 下载Ubuntu镜像&#xff1a;需要访问Ubuntu官网下载所需的Ubuntu 20.04桌面版ISO镜像[1]。制作启动盘&#xff1a;下载完…

公网IP地址如何查询?

公网IP地址是指在互联网中可以被全球范围内的设备访问的IP地址。在网络通信中&#xff0c;公网IP地址扮演着重要的角色&#xff0c;它可以标识设备在互联网中的位置。查询公网IP地址是一种常见的网络管理需求&#xff0c;因为它能够提供网络设备的准确位置信息&#xff0c;方便…

AI 绘画爆火背后:扩散模型原理及实现

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Java进阶学习笔记34——Arrays类

Arrays&#xff1a; 用来操作数组的工具类。 解释说明&#xff1a; 只要知道代码这么写就可以了。 package cn.ensource.d5_arrays;import java.util.Arrays; import java.util.function.IntToDoubleFunction;public class ArraysTest1 {public static void main(String[] arg…

Spark任务调度

Spark任务调度是Spark作业执行的核心组成部分&#xff0c;它负责将作业拆分成多个任务&#xff0c;并将这些任务分配到集群中的工作节点上执行。以下是关于Spark任务调度的详细解释&#xff0c;结合参考文章中的信息&#xff1a; 1. 调度基本概念 作业&#xff08;JOB&#x…

LTspice仿真中设置电阻随时间变化的方法

背景&#xff1a; 笔者找了很多资料都没有看到如何设置电阻、电容等参数随时间变化。但在实际模拟中&#xff0c;总会遇到需要模拟这些量的变化。故撰写此文&#xff0c;供大家参考。 除了模拟随时间变化外&#xff0c;同样的思路也可以模拟随其他变量变化 效果展示 设置电…

Kubernetes 之 ConfigMap

Kubernetes 之 ConfigMap ConfigMap 定义 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。通过使用 ConfigMap 可以将你的配置数据和应用程序代码分开。 Conf…

Linux的MySQL 数据库备份单循环与多循环shell脚本

本次测试为centos7.6 Linux环境下定时备份MySQL数据库。脚本使用mysqldump命令进行单次数据库备份&#xff0c;并将备份文件存储在指定的目录中。 MySQL 数据库备份单循环 #!/bin/bash DATE$(date %F_%H-%M-%S) HOSTlocalhost USER"your_username" PASS"your_…

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型

第三部分 高级语言特性 第14章 泛型 ​ Object Pascal 提供的强类型检查对于提高代码的正确性非常有用&#xff0c;这也是我在本书中经常强调的一个主题。不过&#xff0c;强类型检查也可能带来麻烦&#xff0c;因为你可能想编写一个存储过程或类&#xff0c;对不同的数据类型…

32【Aseprite 作图】石头——拆解

1 石头先画轮廓&#xff0c;还是2 4 1 1 2 2 2&#xff0c;这样画一个圆的轮廓 或者2 1 1 3 5 1 1 1 1 2 4 &#xff0c; 2 最暗一层的黑色&#xff0c;做阴影部分&#xff0c;就是7 4 3 2 做最深的部分 各个地方画一些浅色的&#xff0c;做高光部分&#xff0c;上面的高光偏圆…

015、列表_应用场景

1.消息队列 如图所示,Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。 2.文章列表 每个用户有属于自己的文章列表,现…

前端WebSocket与WiFi:深度探索与实战应用

前端WebSocket与WiFi&#xff1a;深度探索与实战应用 在数字化时代&#xff0c;前端技术与网络通信的紧密结合为我们的生活带来了前所未有的便利。其中&#xff0c;WebSocket和WiFi作为前端网络通信的重要组成部分&#xff0c;更是引发了广泛关注。本文将从四个方面、五个方面…

收银系统源码-千呼新零售2.0【智慧供应链】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

FinalShell 配置SSH密钥登陆

转载请标明出处&#xff1a;http://blog.csdn.net/donkor_/article/details/139355489 文章目录 前言生成密钥服务器配置公钥本地配置私钥存储私钥FinalShell配置 总结 前言 本机FinalShell 配置SSH密钥登陆服务器&#xff0c;这样就不再需要使用密码进行登陆了。由于FinalSh…