Implement a simple command interpreter in Linux. The interpreter should:

  1. support both internal and external commands, and internal commands support two (cd, exit);
  2. able to save 10 historical commands

The following system calls can be used to implement the interpreter:

  1. fork() —create a new process;
  2. execve() —Load a new program and execute it;
  3. wait() —waiting for child process to exist
  4. chdir() —change the working direction of a process.

完整代码实现:

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#define TRUE 1
#define MAX_SIZE 1024 void print_prompt(){
char cwd[MAX_SIZE];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
printf(" @ :\033[0;34m%s\033[0m ", cwd);
}
} int read_input(char* str){
char buf[MAX_SIZE];
fgets(buf, MAX_SIZE, stdin);
if (strlen(buf) != 1) {
strcpy(str, buf);
return 1;
} else {
return 0;
}
} int exec_command(char* user_input){
char* inputs[MAX_SIZE];
bzero(inputs, MAX_SIZE); // Very imortant, fuck gcc!
char* token = strtok(user_input, " ");
int i=0;
while (token != NULL) {
inputs[i] = token;
i++;
token = strtok(NULL, " ");
}
if(strcmp(inputs[0], "exit")==0){
printf("Bye.\n");
return 1;
}
if(strcmp(inputs[0], "cd")==0){
chdir(inputs[1]);
return 0;
}
char path[100];
bzero(path, 100);
strcat(path, "/bin/");
strcat(path, inputs[0]);
if (fork() != 0){
int *status;
waitpid(-1, status, 0);
} else {
execve(path, inputs, 0);
}
return 0;
} void main(){
while(TRUE){
char input_string[MAX_SIZE];
print_prompt();
if(!read_input(input_string)) continue;
int len = strlen(input_string);
input_string[len-1]='\0';
if(exec_command(input_string)) break;
}
}

实现一个简单的 Linux Shell(C++)的更多相关文章

  1. 写一个简单的 Linux Shell (C++)

    这里可以找到代码 github.com/z0gSh1u/expshell 支持的特性 单条指令的执行 引号引起的参数(如 $ some_program "hello, world" ...

  2. 写了一个简单的Linux Shell用来下载文件

    #!/bin/sh ; i<; i=i+ )); do # 利用spider来探测请求的资源是否存在,并把请求的结果写入到一个文件 wget --spider --http-user=usern ...

  3. 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...

  4. 第三节 构造一个简单的Linux系统MenuOS——20135203齐岳

    第三节 构造一个简单的Linux系统MenuOS By 20135203齐岳 Linux内核源代码 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相 ...

  5. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...

  6. Linux内核分析— —构造一个简单的Linux系统MenuOS(20135213林涵锦)

    Linux内核分析— —构造一个简单的Linux系统MenuOS 实验内容 Linux内核的启动过程,从start_kernel到init进程启动 使用实验楼的虚拟机打开shell cd LinuxK ...

  7. 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

    构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在lin ...

  8. 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记

    此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...

  9. 《Linux内核分析》第三周学习小结 构造一个简单的Linux系统OS

    郝智宇 无转载 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第三周 构造一个简单的Linux系统Me ...

随机推荐

  1. 【复习笔记】重习 AC 自动机

    发现已经忘了许多....于是复习一下 基础要点概况 AC 自动机基于 Trie 树 的结构,即构建 AC 自动机前需要先建 Trie. 一个状态中除了转移 \(\delta\) 之外还有失配指针 \( ...

  2. windows隐藏文件

    attrib命令用来显示或更改文件属性. ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S ...

  3. Tensorflow学习笔记No.11

    图像定位 图像定位是指在图像中将我们需要识别的部分使用定位框进行定位标记,本次主要讲述如何使用tensorflow2.0实现简单的图像定位任务. 我所使用的定位方法是训练神经网络使它输出定位框的四个顶 ...

  4. MySQL的binlog有啥用?谁写的?在哪里?怎么配置

    目录 一.唠嗑 二.什么是bin log? 三.它在哪里? 四.bin log的相关配置 五.binlog 有啥用? 六.超有用的参数 sql_log_bin 七.未来几篇文章 推荐阅读 一.唠嗑 文 ...

  5. 前端js部署

    1 执行命令 cnpm run build 2.2 提取dist静态资源 将静态资源放置后端static下   /static文件是django后端的部署文件夹 3 Nginx写入配置文件 写入etc ...

  6. Sharding-JDBC分库分表简单示例

    1. 简介 Sharding是一个简单的分库分表中间件,它不需要依赖于其他的服务,即可快速应用在实际项目的分库分表策略中. 2. 初始化数据库(db0.db1.db2) 1 #创建数据库db0 2 C ...

  7. Windows远程报错:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断

    故障原因:Windowsserver超过两人的远程连接是收费的,有120天免费试用期,超过这个时间再连接就会报错. 解决方法一: 进行续费 解决方法二: 1,在运行里运行 mstsc /v:ip    ...

  8. js下 Day09、事件(二)

    一.事件流 事件流描述的是从页面中接收事件的顺序,目前主要有三个模型: #1. 事件冒泡: 事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素

  9. [日常摸鱼]bzoj1470[noi2002]Savage

    晚上做到的一个扩欧的水题(?) wa了好几发感觉自己药丸-重新推了一遍公式才发现自己打错了orz 借此复习一下扩欧吧-orz 题目:http://www.lydsy.com/JudgeOnline/p ...

  10. 学习tomcat-如何建立连接,处理请求

    tomcat如何建立连接,处理请求 学习探讨tomcat如何建立网络连接协议,并处理客户端过来的请求 建立http网络连接,指定通信协议 tomcat在创建时,会创建连接对象,负责处理客户端的请求,基 ...