实现一个简单的 Linux Shell(C++)

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;
    }
}

原文地址:https://www.cnblogs.com/justsong/p/12219782.html

时间: 2024-07-28 22:25:34

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

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

#!/bin/sh for (( i=0; i<30; i=i+1 )); do # 利用spider来探测请求的资源是否存在,并把请求的结果写入到一个文件 wget --spider --http-user=username --http-password=passwd --no-check-certificate -e "https_proxy=http://URL:port" fileURL &> spiderResult.txt # 把文件内容读取到一个变量

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

作业3:构造一个简单的Linux系统MenuOS 20135115臧文君

构造一个简单的Linux系统MenuOS 注:作者:臧文君,原创作品转载请注明出处,<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码介绍 1.根目录 arch/x86目录下的代码是我们重点关注的,arch中包括支持不同CPU的源代码. init目录下包含内核启动相关的代码,如main.c(start_kernel函数相当于普通C程序的main函数,是Linux内核初始化的起点). ipc

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

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

构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在linux内核源码里面arch占有的代码量相当庞大.arch/x86目录下的代码是我们重点关注的. 2.内核启动相关的代码基本都在init目录下(main.c). start_kernel是初始化linux内核的起点. start_kernel相当于c程序中的main函数 3.linux内核的核心代码在k

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

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE(2.29——3.6)构造一个简单的Linux系统MenuOS SECTION 1 Linux内核源代码简介 1.操作系统的两把宝剑(回顾上一讲) 中断上下文的切换——保存现场&恢复现场 进程上下文的切换 2.Linux内核源代码简介 打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核代码简介 内核源码三个个重要目录 arch占有代码量最大,支持不同cpu的源代码,arch/x86目录下的代码是我们关注的重点 init,内核启动相关的代码基本都在init目录下,init/main.c中start_kernel是整

Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核心代码都在kernel目录中 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相关代码 kenerl/ 进程调度相关代码 ipc/ 进程间通信 lib/ 公共库文件 mm/ 内存管理相关的代码 (二)构造一个简单的Linux系统 启动MenuOS系统

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

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 回顾: [计算机三个法宝] 1)存储程序计算机 2)函数调用堆栈 3)中断 [操作系统两把宝剑] 1)中断上下文的切换:保存现场和恢复现场 2)进程上下文的切换 一.使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开