当前位置: 首页 > news >正文

【Linux】简易shell外壳的制作

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>#define NUM 1024
#define SIZE 32
#define SEP " "// 保存完整的命令行字符串
char cmd_line[NUM];
// 保存打散之后的命令行字符串
char *g_argv[SIZE];// shell 运行原理:通过让子进程执行命令,父进程等待&&解析命令
int main()
{// 0. 命令行解释器,一定是一个常驻内存的进程,不退出while(1){// 1. 打印提示信息 [zs@localhost myshell]#printf("[zs@localhost myshell]# ");fflush(stdout);// 2. 获取输入信息[输入的是各种指令和选项]memset(cmd_line, '\0', sizeof cmd_line);if(fgets(cmd_line, sizeof cmd_line, stdin) == NULL){continue;}// "ls -l -a\n\0"cmd_line[strlen(cmd_line) - 1] = '\0';//printf("echo: %s\n", cmd_line);// 3. 命令行字符串解析:"ls -l -a" -> "ls" "-l" "-a"g_argv[0] = strtok(cmd_line, SEP); // 第一次调用,要传入原始字符串int index = 1;if(strcmp(g_argv[0], "ls") == 0){g_argv[index++] = (char*)"--color=auto";}if(strcmp(g_argv[0], "ll") == 0){g_argv[0] = (char*)"ls";g_argv[index++] = (char*)"-l";g_argv[index++] = (char*)"--color=auto";}while(g_argv[index++] = strtok(NULL, SEP)); // 之后继续解析原始字符串,传入NULL// for debug//for(index = 0; g_argv[index]; ++index)//{//    printf("g_argv[%d]: %s", index, g_argv[index]);//}// 4. 让父进程(shell)自己执行的命令,叫做内置命令/内建命令 if(strcmp(g_argv[0], "cd") == 0){if(g_argv[1] != NULL){   chdir(g_argv[1]);}}// 5. fork()pid_t id = fork();if(id == 0){// 子进程execvp(g_argv[0], g_argv);exit(1);}// fatherint status = 0;pid_t ret = waitpid(id, &status, 0);if(ret > 0){printf("exit code: %d\n", WEXITSTATUS(status));}}
}
http://www.lryc.cn/news/102020.html

相关文章:

  • TenserRT(四)在 PYTORCH 中支持更多 ONNX 算子
  • 前端高级面试题-浏览器
  • Mongodb 多文档聚合操作处理方法三(聚合管道)
  • Zabbix分布式监控配置和使用
  • XCTF_very_easy_sql
  • [React]useMemoizedFn和useCallback对比
  • 计算机毕设 深度学习人体跌倒检测 -yolo 机器视觉 opencv python
  • 完全背包
  • 【软件测试】webdriver常用API演示(Java+IDEA+chrome浏览器)
  • Linux安装MySQL 8.1.0
  • 多线程面试相关的一些问题
  • 【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)
  • Vue+axios如何解决跨域
  • 网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性
  • 并发编程 - CompletableFuture
  • IPIDEA参展ChinaJoy!探索未来创新科技的峰会之旅
  • 2023最新ChatGPT商业运营版网站源码+支持ChatGPT4.0+GPT联网+支持ai绘画(Midjourney)+支持Mind思维导图生成
  • 轮趣科技教育版ros小车键盘控制运动
  • 深入理解Python中的os.chdir()方法
  • 【Golang 接口自动化02】使用标准库net/http发送Post请求
  • LaTex语法(常用数学符号的语法和注意事项)
  • Yunfly 一款高效、性能优异的node.js企业级web框架
  • mac m1安装Centos9
  • 深入理解mAP
  • PostGis -基础、Springboot 整合、电子围栏处理
  • 【Linux】多线程的补充
  • 【MySQL】表的操作
  • 自动化测试 selenium(测试系列7)
  • 小研究 - JVM 垃圾回收方式性能研究(二)
  • 【网络安全带你练爬虫-100练】第15练:模拟用户登录