Linux(五)创建一个miniShell

news2024/9/21 0:29:50

前情提要:掌握进程控制中的进程创建、进程终止、进程等待、进程替换。可以参考下方博文

LInux(四)进程控制(创建、终止、等待、替换)

了解strtok函数的使用

正文:

目录

Shell是什么?

如何进行实现?

        1、用户终端输入命令

        2、程序对输入命令进行解析

        3、创建一个子进程(脏活子进程来做)

        4、子进程内部进行程序替换,让子进程处理对应程序

        5、父进程中进行进程等待,避免产生僵尸进程

 完整源码:


Shell是什么?

根据用户所输入的命令,来进行一系列对应命令名称的对应操作。

如何进行实现?

        1、用户终端输入命令

    9   while(1)
   10   {
   11     printf("[Linux: Shell] $ ");
   12     fflush(stdout);
   13
   14     char cmd[1024] = {0};// 初始化一个cmd数组用来存放输入信息
   15     gets(cmd); 

   16   }

        2、程序对输入命令进行解析

   16     int argc = 0;
   17     char*argv[32] = {NULL};
   18     argv[argc++] = strtok(cmd, " "); // 字符串分割函数,将空格字符全部替换为'\0';
   19     while((argv[argc] = strtok(NULL, " "))!=NULL){
   20         argc++;

   21      }

        3、创建一个子进程(脏活子进程来做)

   25     pid_t child_pid = fork();                                                             
   26     if(child_pid < 0){                                                                    
   27       perror("error fork");
   28       continue;
   29     }else if(child_pid == 0) {子进程}        
                                                 

        4、子进程内部进行程序替换,让子进程处理对应程序

                子进程创建失败就要进行进程终止

   29        }else if(child_pid == 0){                                                                               
   30         //execve、execvp、execv、execl、execlp、execle
   31         //这里选择execvp()  不需要给出环境变量、也不需要指定路径
   32         execvp(argv[0], argv);  // argv第一个参数就保存的命名名
   33         perror("execvp error");                                                                      
   34         exit(0);    // 上方进程替换成功进入新程序,替换失败走到exit(0)

        5、父进程中进行进程等待,避免产生僵尸进程

   36     wait(NULL);   //进行等待任意一个子进程退出

执行结果:

 完整源码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include<string.h>

int main()
{
  while(1)
  {
    printf("[Linux: Shell] $ ");
    fflush(stdout);
    
    char cmd[1024] = {0};// 初始化一个数组用来存放输入信息
    gets(cmd);
    int argc = 0;
    char*argv[32] = {NULL};     
    argv[argc++] = strtok(cmd, " "); // 字符串分割函数,将空格字符全部替换为'\0';
    while((argv[argc] = strtok(NULL, " "))!=NULL){
        argc++;
    }
    for(int i = 0; argv[i]!=NULL; i++)
      printf("[%s]\n",argv[i]);    //显示输入信息
    
    pid_t child_pid = fork();
    if(child_pid < 0){
      perror("error fork");
      continue;
    }else if(child_pid == 0){
        //execve、execvp、execv、execl、execlp、execle
        //这里选择execvp()  不需要给出环境变量、也不需要指定路径
        execvp(argv[0], argv);
        perror("execvp error");
        exit(0);    // 上方进程替换成功进入新程序,替换失败走到exit(0)
    }
    wait(NULL); // 进行等待任意一个子进程退出
  }
  return 0;
}

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

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

相关文章

蓝桥杯之二分与前缀和

蓝桥杯之二分二分板子&#xff1f;第一次和最后一次出现的位置机器人跳跃问题四平方和分巧克力&#xff1f;典型二分找大的&#xff08;从右往左找&#xff09;二分upper_bound(a1,an1,x)-a&#xff1f;递增三元组前缀和取余&#xff1f;K倍区间二维前缀和&#xff1f;激光炸弹…

17种编程语言实现排序算法-合并排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言&#xff1a;C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台&#xff1a;安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

分享139个ASP源码,总有一款适合您

ASP源码 分享139个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 139个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1Vk4U4EXVCWZWPMWf9ax2dw?pwdif23 提取码&#x…

【C++】类和对象(上)---什么是类?

目录1.面向过程和面向对象初步认识2.类的引入2.1使用struct定义类3.类的定义3.1类的两种定义方式&#xff1a;3.2成员变量命名规则的建议3.3成员函数与成员变量定义的位置建议4.类的访问限定符及封装4.1访问限定符4.2封装5.类的作用域6.类的实例化7.类对象模型7.1如何计算类对象…

springboot静态资源目录访问,及自定义静态资源路径,index页面的访问

springboot静态资源目录访问&#xff0c;及自定义静态资源路径&#xff0c;index页面的访问静态资源目录的访问位置静态资源访问测试自定义静态资源路径和静态资源请求映射web首页的访问自定义静态资源请求映射影响index.html首页的访问的**解决方案**&#xff1a;1.取消自定义…

【JUC系列】CountDownLatch实现原理

简单示例 public class Main {private static final int NUM 3;public static void main(String[] args) throws InterruptedException {CountDownLatch latch new CountDownLatch(NUM);for (int i 0; i < NUM; i) {new Thread(() -> {try {Thread.sleep(2000);Syste…

梯度之上:Hessian 矩阵

原文链接&#xff1a;原文 文章目录梯度之上&#xff1a;Hessian 矩阵梯度、雅克比矩阵海森矩阵海森矩阵应用梯度之上&#xff1a;Hessian 矩阵 本文讨论研究梯度下降法的一个有力的数学工具&#xff1a;海森矩阵。在讨论海森矩阵之前&#xff0c;需要首先了解梯度和雅克比矩阵…

基础知识一览3

这里写目录标题1.Servlet1.1 入门1.2 什么是Servlet1.3 Servlet的作用1.4 Servlet生命周期1.5 Servler的体系结构1.6 Servler的两种配置方式2.Filter2.1 Filter拦截路径配置2.2 过滤器链2.2 入门2.3 过滤器链2.4 过滤器生命周期3.Listener3.1 监听器分类3.1.1 一类监听器4.Serv…

ESP32设备驱动-GA1A12S202光线传感器驱动

GA1A12S202光线传感器驱动 1、GA1A2S202介绍 GA1A1S202 对数刻度模拟光传感器使用起来非常简单,只需添加电源,然后监控模拟输出。大多数光传感器对光强度具有线性响应,这意味着它们对低光水平非常不敏感,然后在高光水平下达到最大值。另一方面,该传感器具有对数响应,这…

第九届蓝桥杯省赛 C++ B组 - 乘积最大

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;乘积最大 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家…

Thread的join()方法的作用

文章目录官方文档对join()的解释&#xff1a;结合实例解释官方文档对join()的解释&#xff1a; Thread.join() method javadocs&#xff08;点击跳转&#xff09; join() Waits for this thread to die. 线程类的 join()方法将等待子线程完成&#xff0c;然后继续当前线程。j…

【Python】常见的时间操作(时间区间、时间相加减、指定年月天数等。。。

前言 记录在Python中使用的时间操作&#xff0c;方便以后查找。 在使用Python中&#xff0c;常会遇到关于时间的操作。 虽说每次都能借助搜索引擎找到解决的方法&#xff0c;但好记性不如烂笔头&#xff0c;遂有此文。 暂时记录了笔者所使用过的Python关于时间的操作&#xff0…

人世正道沧桑,她亦奋力向前 --读《李清照传》有感

有一次陪小孩晨读&#xff0c;朗诵诗歌&#xff0c;读到了李清照的《夏日绝句》&#xff1a;“生当作人杰&#xff0c;死亦为鬼雄。至今思项羽&#xff0c;不肯过江东”。这首诗是1129年&#xff0c;李清照在芜湖的乌江县触景生情&#xff0c;有感而作的。这首诗写得大气磅礴&a…

JQuery总结(一)

JQUERY概述&#xff1a; JQUERY和DOM相互转换&#xff1a; 基础选择器&#xff1a; 筛选选择器&#xff1a; show hide toggle方法 jQuery hover方法 jQuery stop()方法 例子&#xff1a;显示、隐藏、切换 button{/* 随着字体大小变化,button跟着变化大小 */font-size: 20px;ba…

【Git】国内代码托管中心码云(Gitee)

9、国内代码托管中心码云(Gitee) 9.1、简介 众所周知&#xff0c;GitHub 服务器在国外&#xff0c;使用 GitHub 作为项目托管网站&#xff0c;如果网速不好的话&#xff0c;严重影响使用体验&#xff0c;甚至会出现登录不上的情况。针对这个情况&#xff0c;大家也可以使用国…

边界框回归 Bounding-Box Regression

文章目录边界框回归&#xff08;Bounding-Box Regression&#xff09;一、边界框回归简介二、边界框回归细节三、相关问题思考1. 为什么使用相对坐标差?2. 为什么宽高比要取对数?3. 为什么IoU较大时边界框回归可视为线性变换&#xff1f;边界框回归&#xff08;Bounding-Box …

协调中心性能大对比:zookeeper是如何解决负载均衡问题的

作为分布式系统的一个长久话题&#xff0c;协调中心的性能是一个很有意思的突破口。 作为java的分布式协调中心&#xff0c;常见的有zookeeper&#xff0c;redis &#xff0c;memcache等全局性功能的组件&#xff0c;也有MySQL&#xff0c;mongoDB之类的数据库形持久存储。 两…

PyCharm无法打开,提示Internal error错误。

安装LeetCode插件后&#xff0c;重新打开PyCharm后&#xff0c;出现该错误。 删除安装目录下的 plugins 文件夹后&#xff0c;重新打开后&#xff0c;又出现该错误。 重新把回收站的文件夹恢复后&#xff0c;再次打开还是之前那个错误。 尝试了 cmd ,powershell&#xff0c;管…

Python Flask构建微信小程序订餐系统 (五)

🔥 微信小程序登录态 🔥 所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法。 WEB服务器通过浏览器携带的cookie获取session来判断是否是同一用户(或浏览器);Restful服务通过客户端传过来唯一ID,来识别调用用户。 维护登录态的原因 有自身…

行为型模式-模板方法模式

1.概述 在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。 例如&…