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

Linux小程序: 手写自己的shell

注意: 本文章只是为了理解shell内部的工作原理, 所以并没有完成shell的所有工作, 只是完成了shell里的一小部分工作

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h> 
#include <sys/wait.h>#define LEFT "["
#define RIGHT "]"
#define END "#"
#define SPLIT " "
#define LINE_SIZE 1024
#define ARGV_SIZE 32
#define EXIT_CODE 66
#define PWD_SIZE 100int lastexit = 0;
int quit = 0;
char pwd[PWD_SIZE];const char* getusername() {return getenv("USER");
}const char* mygethostname() {return getenv("HOSTNAME");
}void getpwd() {getcwd(pwd, PWD_SIZE);
}void display() {getpwd();printf(LEFT"%s@%s %s"RIGHT""END" ", getusername(), mygethostname(), pwd);
}void getinput(char* cline, int size) {char* s = fgets(cline, size, stdin);assert(s != NULL);cline[strlen(cline) - 1] = '\0';//printf("%s\n", cline);
}int split(char* cline, char* argv[]) {int i = 0;//printf("%s", cline);argv[i ++] = strtok(cline, SPLIT);while (argv[i ++] = strtok(NULL, SPLIT));return i - 1;
}void normalExe(char* argv[]) {extern char** environ;pid_t id = fork();if (id < 0) {perror("fork");//continue;} else if (id == 0) {// childexecvpe(argv[0], argv, environ);exit(EXIT_CODE);}// fatherint status = 0;pid_t ret = waitpid(id, &status, 0);//  if (ret > 0) printf("wait success pid: %d\n", ret);if (ret > 0) lastexit = WEXITSTATUS(status);
}int neijian(char* argv[], int argc) {if (argc == 2 && strcmp(argv[0], "cd") == 0) {chdir(argv[1]);getpwd();return 1;}return 0;
}int main() {//int quit = 0;char cline[LINE_SIZE];char* argv[ARGV_SIZE] = { NULL };extern char** environ;while (!quit) {display();getinput(cline, LINE_SIZE);int tt = split(cline, argv);if (tt == 0) continue;//printf("%d\n", tt);/*int i = 0;for (i = 0; argv[i]; ++ i)printf("%s ", argv[i]);printf("\n");*/// 内建命令执行//内建命令本质上就是shell内部的一个函数int n = neijian(argv, tt);//printf("%d\n", n); //普通命令执行if (!n) normalExe(argv);}return 0;
}
http://www.lryc.cn/news/329780.html

相关文章:

  • javaSwing租户管理系统
  • cesium实现竖立的圆
  • 汽车电子行业知识:智能汽车电子架构
  • LeetCode146:LRU缓存
  • 【Unity音游制作】你玩过节奏大师吗?(Koreographe插件导入游戏主体)【一】
  • 高效解决Ubuntu Server 18.04.1 LTS 64bit更新gdb8.1.1到gdb12.1
  • 【公示】2023年度青岛市级科技企业孵化器拟认定名单
  • 【软件安装】(十四)Ubuntu22.04安装Psensor硬件监视器
  • 数组合并小程序
  • python练习二
  • 专升本-数字媒体
  • 蓝桥杯算法题-发现环
  • Oracle存数字精度问题number、binary_double、binary_float类型
  • Java封装最佳实践:打造高内聚、低耦合的优雅代码~
  • 开源,微信小程序-超级计算器T3000 简介
  • Dimitra:基于区块链、AI 等前沿技术重塑传统农业
  • 降低项目延期概率的5大注意事项
  • 在VUE页面调用Extjs中定义的方法
  • 【独立开发前线】Vol.32 能够坚持下去的人并没有你想象的那么多
  • Java 扫描某包下所有类的注解并获得注解值
  • 根据实例逐行分析NIO到底在做什么
  • TypeScript-对象的类型(接口)
  • Windows服务器安全策略配置几个步骤,轻松加强服务器安全
  • Hive详解(2)
  • 【浅尝C++】STL第二弹=>迭代器失效详解/vector常用接口使用示例/vector底层结构探索/vector模拟实现代码详解
  • 【pytest】pytest` 中几种常用的参数化方法
  • 设计模式-装饰者模式在Java中使用实例-打印发票装饰抬头和脚注
  • parallel linux虚拟机没有root权限
  • 科技下乡:数字乡村改变乡村生活方式
  • 【GitLab】Ubuntu使用宝塔安装GitLab最新社区版