首页 > 系统相关 >LInux 实战:自己写一个shell

LInux 实战:自己写一个shell

时间:2024-06-09 20:30:18浏览次数:24  
标签:实战 index shell cmd argv LInux line include

 1.将前面所学的东西融合起来写一个shell   ——可以更好的理解啥叫shell

2.以我现阶段的能力只能模拟实现部分

//写一个简单的shell
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>



#define NUM 1024
#define SIZE 321

//保存完整的命令行字符串
char cmd_line[NUM];
//保存打散之后的命令行字符串
char* g_argv[SIZE];

//shell运行原理:通过让子进程执行命令,父进程等待&&解析命令;
int main()
{
    //命令行解释器,一定是一个常驻内存的进程,不退出                                              
    while (1)
    {
        //1.打印出提示信息[qk1@local host myshell]#                                                 
        printf("[root@local host myshell]#");
        fflush(stdout);
        memset(cmd_line, '\0', sizeof(cmd_line));

        //2.获取用户的输入和选项:"ls -a -l -i"                                                                       
        if (fgets(cmd_line,sizeof cmd_line, stdin) == NULL)
        {
            continue;
        }
        cmd_line[strlen(cmd_line - 1)] = '\0';

        //3.命令行字符串解析
        g_argv[0] = strtok(cmd_line, " ");//第一次调用,要传入原始字符串
        int index = 1;
        if (strcmp(g_argv[0], "ls") == 0)
        {
            g_argv[index++] = "--color=auto";
        }
        
        while (g_argv[index++] = strtok(NULL, " "));
        
        //for debug
       /* for (index = 0; g_argv[index]; index++)
        {
            printf("g_argv[%d]:%s\n", index, g_argv[index]);
        }*/
       
        //4.to do .内置命令,让父进程shell自己执行的命令,我们叫内置命令,也叫内建命令
        //内建命令的本质其实就是shell中的一个函数调用;
        if (strcmp(g_argv[0], "cd") == 0)
        {
            if (g_argv[1] != NULL) chdir(g_argv[1]);//cd path. cd ..
            continue;
        }
        
        //5.fork()   
        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,NULL);
        if (ret > 0)printf("exit code:%d\n", WEXITSTATUS(status));
    }
 
   return 0;
 }

标签:实战,index,shell,cmd,argv,LInux,line,include
From: https://blog.csdn.net/qincjun/article/details/139564402

相关文章

  • Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
    系列文章目录Django入门全攻略:从零搭建你的第一个Web项目DjangoORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作DjangoORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解DjangoORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践跨域问题与Django解决......
  • linux系统安全及应用
    一、账号安全控制用户账号是计算机使用者的身份凭证或标识,每个要访问系统资源的人,必须凭借其用户账号才能进入计算机。在 Linux 系统中,提供了多种机制来确保用户账号的正当、安全使用。1、账号的基本安全措施(1)系统账号清理常见的非登录用户账号包括 bin、daemon、adm、l......
  • Linux c fread/fseek 函数
    函数:freadsize_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);参数说明:参数buffer指向要读取的数组中首个对象的指针size每个对象的大小(单位是字节)count要读取的对象个数stream输入流函数:fseekintfseek(FILE*stream,longintoffse......
  • 【30天精通Prometheus:一站式监控实战指南】第16天:snmp_exporter从入门到实战:安装、配
    亲爱的读者们......
  • OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:实战|OpenCV实现扫描文本矫正应用与实现详解(附源码)1导 读    本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。    2背景介绍  在使用打印机或扫描仪......
  • C++系统编程篇——linux编辑器vim
    Linux编辑器vim(1)vim常用模式命令/正常模式控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insertmode下,或者到lastlinemode插入模式只有在Insertmode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。底行模式......
  • AI搜索哪家强?16款产品实战测评,效率飙升秘籍!
    文章推荐AI日报|国产大模型迎来新卷王,天工MoE全球首用4090推理,马斯克计划豪掷90亿购买GPUAI日报|斯坦福团队被曝抄袭国内大模型已删库跑路!英伟达打破摩尔定律,机器人时代到来AI搜索,不只是技术,它是一种理解世界的新方式。最近Perplexity被传出正进行新一轮2.5亿美元融资,短短6个......
  • 11 深入理解Linux文件系统与日志分析
    目录11.1深入理解Linux文件系统    11.1.1inode与block详解        1.inode和block概述        2.inode的内容        3.inode的号码        4.inode的大小    11.1.2硬链接与......
  • 服务器linux系统 Debian 更新安全补丁命令
    服务器linux系统Debian更新安全补丁命令服务器换成Debian系统了,之前用的是centos系统,不过后续不支持更新还是什么,所以换成Debian系统,拿到系统首先是update更新了,把安全补丁打到最新。收集了一些命令,自用收藏。 Debian使用来自存储库的deb软件包来管理Debian系统上软件......
  • Linux之awk
    一、awk介绍1、awk工作原理   逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。   sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读......