快速用C写一个简单的Shell
前言
之所以会写这篇文章,主要是因为我想到我最开始写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);
}
}
后记
虽然代码经过测试,但仍有许多不足,恳请大佬们指出