Linux编程实现一个简单的Shell

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

  在linux中实现一个简单的命令解释程序,功能要求:

  1)同时支持内部命令和外部命令,内部命令支持两个(cd、exit)

  2)支持后台命令

  首先解释一下上面的两个要求,实际上是三种情况:

  1.如果是内部命令cd和exit,那么在父进程里直接分析执行

  2.如果是外部命令,则创建一个子进程,再由子进程从path环境变量中查找相应的文件执行,此时shell会阻塞,等待子进程结束。

  3.如果是后台命令,输入以&结束,它跟外部命令的最大区别是,后台命令创建了子进程后不需要调用wait(*status),也就是不用等待子进程结束,这样就变成了后台进程。

  #include <stdio.h>

  #include <unistd.h>

  #include <stdlib.h>

  #include <sys/wait.h>

  #include <string.h>

  #include <errno.h>

  #define MAXLEN 80

  char cwd[MAXLEN];//当前工作目录

  char *prompt;

  char* parseCmd(char* cmd, char** argarr, int* argc)

  {

  enum states {S_START, S_INTOKEN, S_INQUOTES};

  int numArgs = 0;//参数数目

  int loop = 1;//循环标志

  enum states state = S_START;//当前状态

  int lastch;

  while(loop)

  {

  switch(state)

  {

  case S_START:

  if(*cmd == ‘”‘)

  {

  *argarr++ = cmd + 1;

  numArgs++;

  state = S_INQUOTES;

  }

  else if(*cmd == 0 || *cmd == ‘;’)

  loop = 0;

  else if(*cmd <= ‘ ‘)//忽略ascii码表中的空格符及空格符前面的字符

  *cmd = 0;

  else

  {

  *argarr++ = cmd;

  numArgs++;

  state = S_INTOKEN;

  }

  break;

  case S_INTOKEN:

  if(*cmd == 0 || *cmd == ‘;’)

  loop = 0;

  else if(*cmd <= ‘ ‘)

  {

  *cmd = 0;

  state = S_START;

  }

  break;

  case S_INQUOTES:

  if(*cmd == 0)

  loop = 0;

  else if(*cmd == ‘”‘)

  {

  *cmd = 0;

  state = S_START;

  }

  break;

  }

  cmd++;//指向下一个字符

  }

  *argarr = NULL;//最后一个参数指向空

  if(argc != NULL) *argc = numArgs;

  lastch = cmd[-1];

  cmd[-1] = 0;

  return lastch == ‘;’ ? cmd : NULL;// 如果遇到分号则返回剩余的字符串作为下一条命令

  }

  int main(int argc, char** argv)

  {

  char cmd[80];

  char* source = NULL;

  char* arg[20];

  int statval;

  int numArgs;

  while(1)

  {

  if(source == NULL)

  {

  getcwd(cwd,MAXLEN);

  printf(”%s$ “,cwd);

  //读取命令

  if((source = gets(cmd)) == NULL)

  exit(0);

  }

  source = parseCmd(source, arg, &numArgs);

  if(numArgs == 0) continue;

  //是否退出程序

  if(strcasecmp(arg[0], “exit”) == 0)

  {

  exit(0);//不管exit后面是否还有参数,直接退出

  }

  if(!strcmp(arg[0],”cd”))//切换父进程的工作目录

  {

  chdir(arg[1]);

  continue;

  }

[1][2]

只有经历过地狱般的折磨,才有征服天堂的力量。

Linux编程实现一个简单的Shell

相关文章:

你感兴趣的文章:

标签云: