linux简单的shell实现,实现一个简单的 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

#include

#include

#include

#include

#include

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值