minishell的重定向实现

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
 
char buf[1024] = {0};
char *argv[32];
int argc = 0;
 
void do_face() {
     printf("[san@localhost]$ ");
     fflush(stdout);
     memset(buf, 0x00, 1024);
     //%[^\n]    获取数据直到遇到\n
     //%*c 取出一个字符丢弃
          if (scanf("%[^\n]", buf) != 1) {
         getchar();
     }
     return ;
}
void do_parse()
{
     char *ptr = buf;
     argc = 0;
     while(*ptr != '\0') {
            //当前位置非空白字符
         if (!isspace(*ptr)) {
             argv[argc++] = ptr;
             while(!isspace(*ptr) && *ptr != '\0') {
                 ptr++;
                 }
         }else {
             *ptr = '\0';
             ptr++;
         }
     }
     argv[argc] = NULL;
     return;
 }
 int main()
 {
     // ls >>  >   abc.txt
     // int fd = open(a.txt);
     // dup2(fd, 1);
     // 将原先要写入到标准输出1中的数据,写入到指定文件中
     while(1) {
         do_face();
         //ls  >> a.txt
         int redirect = 0;
         char *file = NULL;
         char *ptr = buf;
         while(*ptr != '\0') {
             if (*ptr == '>') {
                 redirect = 1;//清空重定向
                 *ptr++ = '\0';
                 if (*ptr == '>') {
                     redirect = 2;//追加重定向
                     *ptr++ = '\0';
                 }
                 while(isspace(*ptr) && *ptr != '\0') {
                    ptr++;
                 }
                 file = ptr;
                 while(!isspace(*ptr) && *ptr != '\0') {                       
                    ptr++;
                 }
                 *ptr = '\0';
             }
             ptr++;
         }
         //解析流程:取出空白字符,获取程序名称和参数
         do_parse();
         int pid = fork();
         if (pid < 0) {
             exit(-1);
         }else if (pid == 0) {
             //重定向必须在子进程当中完成
             if (redirect == 1) {
                 int fd = open(file, O_CREAT|O_WRONLY|O_TRUNC, 0664);
                 dup2(fd, 1);
            }else if (redirect == 2) {
                 int fd = open(file, O_CREAT|O_WRONLY|O_APPEND, 0664);
                 dup2(fd, 1);
             }
 
             execvp(argv[0], argv);
             //防止子进程替换失败
             exit(0);
         }
         wait(NULL);
     }
     return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值