代码编织梦想

SHELL外壳的简易实现

1.什么是shell外壳?

shell外壳是连接用户和操作系统的一种中间层软件,负责将用户输入的指令经过处理后提交给操作系统。shell外壳本身也是一个进程,它最主要的职责就是创建子进程并让子进程完成某些任务,但有时shell外壳也会自己执行任务,在linux系统下shell外壳称为bash。

2.如何实现shell外壳

shell外壳的简易实现先依靠fork函数创建子进程,再利用exec*系列函数把子进程替换成某些已经存在于磁盘的可执行程序,最后利用循环实现子进程的持续创建和替换,而父进程shell则不受影响。

以下是shell外壳的模拟实现代码:

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

#define SUM 1024
#define SIZE 32
#define SEP " "

char cmd_line[SUM];
char* g_argv[SIZE];

int main()
{
  while(1)
  {
  printf("[root]");
  fflush(stdout);
  memset(cmd_line,'\0',sizeof(cmd_line));
  if(fgets(cmd_line,sizeof(cmd_line),stdin)==NULL)//从标准输入流获取字符串数据
  {
    continue;
  }
  cmd_line[strlen(cmd_line)-1]='\0';//把fgets最后输入的回车覆盖掉
  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++]="-a";
    g_argv[index++]="-l";
    g_argv[index++]="--color=auto";
  }
  while(g_argv[index++]=strtok(NULL,SEP));//把strtok返回的多个指针存入指针数组中
  if(strcmp(g_argv[0],"cd")==0)//cd命令不能由子进程进行,否则销毁后不影响父进程,应该由父进程进行
  {
    if(g_argv[1]!=NULL)
    {
      chdir(g_argv[1]);
    }
    continue;
  }
  pid_t id=fork();
  if(id==0)
  {
    printf("指令执行中\n");
    execvp(g_argv[0],g_argv);//进程替换为已经存在的环境变量指令
    exit(-1);
  }
  int status=0;
  pid_t ret=waitpid(id,&status,0);
  printf("父进程标记\n");
  printf("exit code:%d\n",WEXITSTATUS(status));//取得子进程退出码
  }
}

总结模拟实现就是利用while循环实现循环往复执行,父进程永不退出,就像一个真正的shell一样,再利用字符数组存储输入命令,利用strtok函数分割字符串存入指针数组中,再交由子进程的exec函数取指定元素后进行替换,完成任务后子进程退出,父进程再次创建新的子进程。

附录:

为什么说环境变量是全局的,被子进程继承的?

//myproc.c
const char* const _env[1024]={"NUMBER=100","NULL"};
int main()
{
  execle("./mytmp","mytmp",NULL,_env);
  return 0;
}

//mytmp.c
int main()
{
  printf("%s",getenv("NUMBER"));
  return 0;
}

这里我们自定义的环境变量-env通过exec函数传递到子进程中,并由子进程利用getenv接收,假如这里传递的是myproc的main函数中的env参数,就可以实现环境变量在父子进程之间的传递了!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_65786321/article/details/127000428

linux shell之十三问 经典文档--转-爱代码爱编程

   Shell十三问——ChinaUnix论坛精华整理         原创 ChinaUnix 网中人 整理 Lkydeer 整理时间 2007-7-19 联系方式 lkydeer@hotmail.com 目   录 1    简介... 3 2    为何叫做shell

shell十三问,为linux学习打基础(一)-爱代码爱编程

第1问:为何叫做shell? 在介绍 shell 是什么东西之前,不妨让我们重新审视使用者与电脑的关系。我们知道电脑的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为“操作系统(Operating System)”的软件来控管,事实上,我们每天所谈的linux,严格来说只是一个操作系统,我们称之为“核心(kernel)”。

shell 十三问_运维个西瓜的博客-爱代码爱编程_shell十三问

shell十三问,是由来自台湾的一个网友于2003年底至2004年初写的一系列shell知识分享,发表于chinaunix论坛。因为在讲解时有深入浅出,使得一些晦涩的知识变得通俗易懂。虽然已经过去了十几年时间,但这些知识的价值既没有减少,更没有过期,是每一个从事运维工作的人员需要认真学习和掌握的。 原文地址如下,不足之处是使用的繁

网中人《shell十三问》简体版整理_huayangshiboqi的博客-爱代码爱编程

    原文地址:http://bbs.chinaunix.net/thread-218853-1-1.html     转载自:https://blog.csdn.net/freexploit/article/details/626660 阅读提示:十三问,篇幅较长,可以点击旁边的目录,挑选你感兴趣的目录进行阅读。         我在 CU 的日子并不

shell经典 shell十三问_这个是心目中喜欢的的博客-爱代码爱编程_shell十三问

                我在 CU 的日子并不长,有幸在 shell 版上与大家结缘。除了跟众前辈学习到不少技巧之外,也常看到不少朋友的问题。然而,在众多问题中,我发现许多瓶颈都源于 shell 的基础而已。每次要解说,却总有千言万语不知从何起之感... 这次,我不是来回答,而是准备了关于 shell 基础的十三个问题要问大家﹗希望 shell 学习者们能够透过寻找答案的过程,好

linux基础入门(详细版)_一杯码农的博客-爱代码爱编程_linux入门基础教程

  一、Linux入门概述 1.1 概述 Linux内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux能运行主要的UNIX工具软件、应用程序和网

shell十三问--shell教程-爱代码爱编程

为什么80%的码农都做不了架构师?>>>    13_questions_of_shell shell十三问--shell教程(markdown 版本) ##shell十三问之1: 何为shell? shell是什么东西之前,不妨让我们重新审视使用者和计算机系统的关系: (此处为使用者和计算机系统的

linux讲座 第十九课 turbolinux shell_chuidengshi7954的博客-爱代码爱编程

Linux讲座 第十九课 TurboLinux Shell --------------------------------------------------------------------------------   shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章

windows外壳_一些漂亮的外壳技巧-爱代码爱编程

在你开始前 了解对本教程的期望以及如何最大程度地利用本教程。 关于本系列 该系列教程简要介绍了UNIX®基本概念,并针对新用户的角度进行了编写。 该系列中的前三篇教程提供了针对MicrosoftWindows®背景的新用户的UNIX系统概述,描述了文件系统和常用命令,介绍了vi (最广泛使用的UNIX编辑器),以及使

python在一个程序里调用另一段程序_linux 中如何在源代码中调用另一个程序?-爱代码爱编程

一、概述 标准 UNIX 操作系统是一个交互式的分时系统,提供了一个支持程序开发全过程的基础和环境,可以支持40个终端用户。UNIX系统是由美国电报电话公司(AT&T)下属的Bell实验室的两名程序员K.汤普逊(Ken Thompson)和D.里奇(Dennis Ritchie)于1969~1970年研制出来的。UNIX问世以来十分流行,它运

shell-爱代码爱编程

shell脚本 在说什么是shell脚本之前,先说说什么是shell。 shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。 总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。 s

shell基础知识-爱代码爱编程

附:Linux终端常用快捷键: Ctrl + d       删除一个字符,相当于通常的Delete键(命令行若无任何字符,则相当于exit;处理多行标准输入时也表示EOF ) Ctrl + h       退格删除一个字符,相当于通常的Backspace键 Ctrl + u       删除光标之前到行首的字符 Ctrl + k       删除光标之前

NVS —— js 实现的node版本管理工具-爱代码爱编程

大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 NVS (Node Version Switcher) NVS 是一个跨平台的 Node.js 的版本切换工具,并且 NVS 本身是用Node.js[1]编写的。 这个工具显然是受到其他 Node.js 版本管理器工具的启发,特别是n

[网络安全提高篇] 一一三.Powershell恶意代码检测 (1)论文总结及抽象语法树(AST)提取-爱代码爱编程

“网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~ 前文介绍作者2020年参加清华大学、Coremai

11-ros 编写简单pub和sub节点[c++]_点亮sncu的博客-爱代码爱编程

本教程介绍了如何创建C++开发语言的pub和sub节点,并演示二者之间通信。至于为什么选择deepin而不是ROS通用的ubuntu,也仅仅是为了支持国产系统。鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指

python vs c++ 谁更快_树莓派c语言比python快多少-爱代码爱编程

背景 我非常喜欢编程语言,之前写过rust、R、python、C++等。我的第一门语言就是R语言,然后在比较掌握R语言之后,又花了很长一段时间学习RCPP。我觉得不管是会R还是说会python,都应该会C\C++。C\C+