欢迎光临散文网 会员登陆 & 注册

快速用C写一个简单的Shell

2022-10-29 23:12 作者:fcanlnony  | 我要投稿

前言
    之所以会写这篇文章,主要是因为我想到我最开始写shell来练手的时候,查了许多资料,他们的实现都太复杂,所以实现一个简易的shell给需要的人做示例(注:本人还在读高中,C是自学的,写的不好请见谅!)

需了解的函数
先来看主要用到的三个函数,strtok用来分割字符,readline用来处理用户输入,execvp(execve的变种,自己找PATH去启动程序),提供这些函数头文件分别为string.h,
readline.h , unistd.h


extern char *strtok (char *__restrict __s, const char *__restrict __delim)

extern char *readline PARAMS((const char *))

extern int execvp (const char *__file, char *const __argv[])


怎么实现
    声明一个char类型的数组,调用readline()获得用户输入存储在该数组,再调用strtok()使指针数组指向该数组,然后fork出一个子进程,在子进程下调用execvp()函数

源码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <readline/readline.h>
#include <wait.h>
#include <sys/types.h>

char *argv[] = {NULL};

void input_strtok(char *input)
{
    argv[0] = strtok(input," ");
    short i = 0;
    while(argv[i] != NULL)
        argv[++i] = strtok(NULL," ");
}

int exec_cmd(char *argv[])
{
    pid_t pidN = fork();
    if(pidN < 0) {
    fprintf(stderr,"Error in fork");
    return -1;
    }
    else if(pidN == 0) {
    if(execvp(argv[0],argv) < 0)
        fprintf(stderr, "myshell : command : %s : could not found\n", argv[0]);
    exit(0);
    } else {
        wait(NULL);
    }
    return 0;
}

int main()
{
    char display_readline[13];
    sprintf(display_readline,"%s","myshell >>> ");
    while (1) {
    char *input = malloc(sizeof(char)*1024);
    memset(input,0x00,1024); //初始化数组
    input = readline(display_readline); //获得用户输入
    if(strcmp(input,"exit") == 0)
        exit(0);
    input_strtok(input); //分割字符串
    exec_cmd(argv); //fork出一个子进程然后运行程序
    free(input);
    }
}

后记

    虽然代码经过测试,但仍有许多不足,恳请大佬们指出

快速用C写一个简单的Shell的评论 (共 条)

分享到微博请遵守国家法律