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

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <wait.h>
#include <ctype.h>

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值