编写简单的shell(输入输出重定向)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main()
{
  char file[32] = {0};
  char cmd[1024] = {0};
  printf("shell:");
  fflush(stdout);
  //%[^\n]		遇到\n结束输入
  //%*c			删除最后一个字符
  if(scanf("%[^\n]%*c",cmd) != 1)
  {
    getchar();
  }
  //解析输入输出重定向
 char *ptr = cmd;
 int flag = 0;
 while(*ptr != '\0')
 {
      if(*ptr == '<')
      {
        *ptr = ' ';
        ptr++;
      }
      if(*ptr == '>')
      {
        *ptr++ = '\0';
        flag = 1;
        if(*ptr == '>')
        {
          flag = 2;
          *ptr++ = '\0';
        }
      while(*ptr != '\0' && isspace(*ptr))
      {
        ptr++;
      }
      strcpy(file,ptr);
      }
      ptr++;
}
//解析字符
  ptr = cmd;
  char *argv[32] = {NULL};
  int argc = 0;
  while(*ptr != '\0') 
  {
    if(!isspace(*ptr))
    {
      argv[argc++] = ptr;
      while(!isspace(*ptr)&& *ptr != '\0')
        ptr++;
      continue;
    }
    else{
      *ptr = '\0';
    }
    ptr++;
  }
   //创建子进程,运行命令
int pid = fork();
if(pid <0)
{
  perror("fork error");
  exit(-1);
}else if(pid == 0)
{
  int fd = -1;
  if(flag == 1)				//重定向
  {
    fd = open(file,O_CREAT|O_WRONLY,0664);
    dup2(fd,1);
  }else if(flag == 2)
  {
    fd = open(file,O_CREAT|O_APPEND|O_WRONLY,0664);
    dup2(fd,1);
  }
  execvp(argv[0],argv);	//替换进程
}
wait(NULL);			//接收子进程,避免子进程称为僵尸进程(虽然不太可能)
return 0;
}

你可能感兴趣的:(Linux)