[进程控制]模拟实现命令行解释器shell

文章目录

  • 1.字符串切割函数
  • 2.chdir()接口
  • 3.模拟实现shell

1.字符串切割函数

在这里插入图片描述

2.chdir()接口

在这里插入图片描述

3.模拟实现shell

  1. 模拟实现的shell下删除: ctrl+backspace
  2. 模拟实现下table/上下左右箭头无法使用[demo]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

#define NUM 1024
#define SIZE 32
#define SEP " "

//获取用户输入的命令行字符串
char cmd_line[NUM];
//将获取的字符串一个个分割开来
char* g_argv[SIZE];

// shell运行原理: 父进程解析命令 等待子进程执行命令
int main()
{
    //命令行解释器是一个常驻内存的进程(直到用户退出)
    while (1)
    {
        //显示提示信息
        printf("[root@localhost myshell]# ");
        fflush(stdout);
        memset(cmd_line, '\0', sizeof cmd_line);
        ///获取用户输入的命令行字符串 "ls -a -l -i"
        if (fgets(cmd_line, sizeof cmd_line, stdin) == NULL)
        {
            continue;
        }
        //"ls -a -l -i\n\0"
        cmd_line[strlen(cmd_line) - 1] = '\0';   //debug: printf("echo: %s\n", cmd_line);
        
        //命令行字符串解析
        g_argv[0] = strtok(cmd_line, SEP); //第一次调用传入原始字符串
        int index = 1;
        if (strcmp(g_argv[0], "ls") == 0)
        {
            g_argv[index++] = "--color=auto";
        }
        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)); //后续解析原始字符串,传入NULL

        //debug:
        //for(index = 0; g_argv[index]; index++)
        //    printf("g_argv[%d]: %s\n", index, g_argv[index]);
        
        //内置命令/内建命令: 父进程(shell)自己执行的命令 本质是shell中的一个函数调用
        if (strcmp(g_argv[0], "cd") == 0) 
        {
            if (g_argv[1] != NULL) 
                chdir(g_argv[1]);

            continue;
        }
        //子进程执行获取到的命令
        pid_t id = fork();
        if (id == 0) 
        {
            // ls -a -l -i
            execvp(g_argv[0], g_argv); 
            exit(1);
        }
        //father
        int status = 0;
        pid_t ret = waitpid(id, &status, 0);
        if (ret > 0) 
            printf("exit code: %d\n", WEXITSTATUS(status));
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高级开发实战MySQL、Redis、MongoDB 数据库,让你一课掌握核心技能

在现代软件开发中&#xff0c;数据库是不可或缺的一部分。MySQL、Redis和MongoDB作为三种常见的数据库系统&#xff0c;具有各自独特的特点和优势&#xff0c;对于高级开发者来说&#xff0c;掌握这三种数据库的核心技能至关重要。本文将带您通过实战的方式&#xff0c;学习如何…

pybind11教程

pybind11教程 文章目录 pybind11教程1. pybind11简介2. cmake使用pybind11教程3. pybind11的历史 1. pybind11简介 项目的GitHub地址为&#xff1a; pybind11 pybind11 是一个轻量级的头文件库&#xff0c;用于在 Python 和 C 之间进行互操作。它允许 C 代码被 Python 调用&am…

22、为什么是卷积?

(本文已加入“计算机视觉入门与调优”专栏,点击专栏查看更多文章信息) 我们先看一看神经网络(或者叫一个AI模型),是如何完成一张图片的推理的。 你肯定听说过阿尔法狗大战柯洁的故事,当时新闻一出,不知大家什么反应,反正我是被震撼到了。机器竟然学到了那么多的棋谱,…

OpenAI发生的大事件总结!

在 11 月的最后一天&#xff0c;OpenAI 官网发布了一则公告&#xff0c;宣布 Sam Altman 再次担任首席执行官&#xff0c;并成立了新的初始董事会。这项持续了 12 天的事件终于得到了解决&#xff0c;OpenAI 回到了正常运营轨道上。 一切仍然保持不变&#xff1a; Sam Altman仍…

免费分享一套开源SpringCloud支持全套二轮四轮全套源码支持云快充1.5、云快充1.6

文章目录 一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介&#xff1f;1. 充电桩云平台&#xff08;含硬件充电桩&#xff09;&…

若依框架分页

文章目录 一、分页功能解析1.前端代码分析2.后端代码分析3. LIMIT含义 二、自定义MyPage,多态获取total1.定义MyPage类和对应的调用方法 一、分页功能解析 1.前端代码分析 页面代码 封装的api请求 接口请求 2.后端代码分析 controller代码 - startPage() getDataTable(…

编程中常见的技术难题有哪些?By AI

编程对于现代社会发展的重要性 编程&#xff0c;即按照特定的规则和逻辑&#xff0c;为计算机设计指令的过程&#xff0c;已经深深地融入现代社会的各个角落。它对人们的生活、工作和科技发展产生了深远的影响。 首先&#xff0c;编程改变了人们的生活方式。如今&#xff0c;…

力扣 --- 最后一个单词的长度

题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hello World&…

van-list的onload事件多次触发的问题

一、问题描述 如图所示&#xff0c;页面刷新的时候&#xff0c;调了3次接口&#xff08;总共27条数据&#xff0c;我分页10条&#xff09;&#xff0c;一直莫名奇妙的 我期望是默认加载第一页&#xff0c;然后我上拉的时候再push第二页的数据 二、解决方法 还是要多看文档 1…

非标设计之气缸概述

气缸的组成&#xff1a; 气缸的分类 单作用气缸&#xff1a; 活塞仅一侧供气&#xff0c;气压推动活塞产生推力伸出&#xff0c;靠弹簧或自重返回。 双作用气缸&#xff1a; 气缸活塞两侧都有气压力&#xff0c;来实现前进或后退动作。 气缸的缓冲 但是&#xff0c;气缸也…

基于Java SSM框架+Vue实现疫情期间医院门诊网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现疫情期间医院门诊网站演示 摘要 21世纪的到来&#xff0c;国家的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;智能科技时代崛起的优势&#xff0c;医院门诊管理系统当然也不能排除在外。疫情期间医院门诊管理系统是以实际运用为开发背…

WPF图像处理之像素操作

文章目录 框架准备图像转灰度像素操作 WPF Image控件的初步使用 框架准备 为了演示C#中的图像处理功能&#xff0c;先在xaml中导入一张图片&#xff0c;并且预留出一个WrapPanel&#xff0c;用于存放操作按钮。 <TabControl TabStripPlacement"Left"><Ta…

前后端数据传输格式(下)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 上篇主要复习了HTTP以及…

MySQL 的 NULL 是怎么存储的?

目录 一、MySQL介绍 二、什么是NULL 三、MySQL 的 NULL 是怎么存储的 一、MySQL介绍 MySQL是一种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种开源软件&#xff0c;由瑞典MySQL AB公司开发&#xff0c;后被Sun Microsystems收购&#xff0c;现在…

阿里云租赁费用_阿里云服务器多配置报价表

阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年87元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;ECS云服务器e系列2核2G配置99元一年、2核4G配置365元一年、2核8G配置522元一年…

组网技术-交换机

交换机&#xff1a; 分类&#xff1a; 根据交换方式划分&#xff1a; 1.存储转发交换&#xff1a;交换机对输入的数据包先进行缓存、验证、碎片过滤&#xff0c;然后进行转发。 时延大&#xff0c;但是可以提供差错校验&#xff0c;并支持不同速度的输入、输出端口间的交换…

【Altera】Cyclone10 FPGA DDR3使用

目录 开发板 硬件 框图 原理图 测试工具 DDR IP核配置 调试及遇到的问题 读写仲裁时序 问题1.拉高read后&#xff0c;wait一直没反应 问题2.DDR校正不过的一个可能性 延伸学习 开发板 Intel官方提供c10的开发套件&#xff1a;Intel Cyclone 10 GX FPGA Development …

算法基础--双指针

前面已经写了两篇关于算法方面的文章&#xff0c;这几天想了下&#xff0c;决定把这个算法整理成一个系列&#xff0c;除了是帮助自己巩固算法知识外&#xff0c;还能够把自己总结的每种算法的套路保存下来并分享给大家&#xff0c;这样以后即使是哪天想要重拾起来&#xff0c;…

数据结构——链表

目录 一、链表的定义 二、链表的基本操作 1. 单链表 1.1. 定义链表结点结构体 1.2. 定义链表类 1.3. 创建链表 1.3.1. 头插法创建链表 1.3.2. 尾插法创建链表 1.4. 遍历链表 1.5. 查找结点 1.6. 插入结点 1.7. 删除结点 1.8. 删除链表 1.9. 完整的单链表类 2. 双…

GeoServer漏洞(CVE-2023-25157)

前半部分是sql注入一些语句的测试&#xff0c;后面是漏洞的复现和利用 Sql注入漏洞 1.登入mysql。 2.查看默认数据库 3.使用mysql数据库 4.查看表 1.查看user 表 2.写注入语句 创建数据库 时间注入语句 布尔注入语句 报错注入语句 Geoserver漏洞&#xff…