源文件名为my_shell.c
Receive_cmd() 获取输入的参数,并放入全局变量的cmd_argc,和cmd_argv里面
my_shell() 创建一个进程,主进程一直不停循环打印K_Linux_Man@MyVi: 子线程去调用系统在/usr/include或者/include下的已经实现的shell命令,里面主要函数为exec函数族中的execvp函数。
#include<stdio.h>
#include<string.h>
#include<error.h>
#include<unistd.h>
#include<sys/types.h>
#define ViName "K_Linux_Man@MyVi:"
char cmd[128];
int START=1,END=-1;
int cmd_argc;
char **cmd_argv;
void Execute_cmd(int, int, char **);
int Select_cmd(char *);
int Receive_cmd();
void main_loop();
int my_shell(int,char **);
int Receive_cmd()
{
char c;
static char cmd[128];
int i = 0, space_i = 0;
while( ( c = getchar() ) != '\n')
{
if(' '==c )
{
cmd[i]='\0';
space_i++;
}
else
{
cmd[i]=c;
}
i++;
}
cmd[i]='\0';
static char * p[10];
int k,n=1;
p[0]=cmd;
for(k=1;k<i+1;k++)
{
if(cmd[k]=='\0')
{
if(n<space_i+1)
{
p[n]=cmd+k+1;
n++;
}
}
}
p[n] = NULL;
cmd_argc=space_i+1;
cmd_argv=p;
my_shell(cmd_argc,cmd_argv);
return 0;
}
void main_loop()
{
printf("%s",ViName);
fflush(stdout);
Receive_cmd();
}
int my_shell(int argc,char **argv)
{
gid_t gid;
if((gid = fork()) < 0)
{
perror("fork");
return -1;
}
if(gid > 0)
{
wait(0);
}
else
{
if(execvp(argv[0],argv) < 0)
{
perror("execvp");
return -1;
}
}
}
int main(int argc,char **argv)
{
for(;START!=END;)
main_loop();
return 0;
}