/*
基于shell外部命令实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <glob.h>
#include <string.h>
#define DELIMS " \t\n"
struct cmd_st
{
glob_t globres;
};
static void promt(void)
{
printf("myshell-01& ");
}
//返回值设定为void,通过命令行调用,避免返回值类型不一致问题
//static void parse(char *line, glob_t *res)
static void parse(char *line, struct cmd_st *res)
{
//ls -a -l /etc /aaa/bb abcdefg
char * tok;
//glob_t globres;
int i = 0;
while(1)
{
tok = strsep(&line, DELIMS);
if(tok == NULL)
break;
//避免空串,当多个分隔符连在一块的时候就会产生空串
if(tok[0] == '\0')
continue;
//glob第一次不追加
glob(tok, GLOB_NOCHECK|GLOB_APPEND * i, NULL, &res->globres);
i = 1;
}
}
int main()
{
char *linebuf = NULL;
size_t linebuf_size = 0;
//2.glob_t res;
struct cmd_st cmd;
pid_t pid;
while(1)
{
promt();
if(getline(&linebuf, &linebuf_size, stdin) < 0)
break;
parse(linebuf, &cmd);
if(0) //是内部命令
{//do something
}
else //外部命令
{
pid = fork();
if(pid < 0)
{
perror("fork");
exit(1);
}
if(pid == 0)
{
execvp(cmd.globres.gl_pathv[0], cmd.globres.gl_pathv);
perror("execvp");
exit(1);
}
else
{
wait(NULL);
}
}
}
exit(0);
}
运行效果如下: