Linux--自定义minishell中实现重定向功能

31 篇文章 0 订阅

minishell中实现重定向功能

  • 捕捉键盘输入 --ls -a \0> test.txt
  • 解析输入信息(重定向类型、重定向文件名称、命名名称、运行参数)
    · 根据命令中的>确定是否包含重定向,根据个数确定重定向类型
    · >之前是基础指令部分,解析出命令名称和运行参数
    · >之后是重定向信息部分,解析出重定向类型、重定向文件名称
  • 创建子进程
  • 在程序替换之前,进行标准输出重定向到指定的文件,open,dup2
  • 在子进程中进行程序替换(替换失败要退出子进程)
  • 在父进程中进行进程等待
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/wait.h>
int main (int argc, char *argv[])
{
    while(1) {
        printf("[user@host path]$ ");
        fflush(stdout);
        char cmd[1024] = {0};
        fgets(cmd, 1023, stdin);
        cmd[strlen(cmd) - 1] = '\0';

        int direct_flag = 0;//0-没有,1-清空,2-追加 
        char *ptr = cmd;
        char *redirect_file = NULL;
        //[  ls   -a  \0\0  text.txt\0]
        while(*ptr != '\0') {
            if (*ptr == '>') {
                direct_flag = 1;
                *ptr = '\0';
                ptr++;
                if (*ptr == '>') {
                    direct_flag = 2;
                    *ptr = '\0';
                    ptr++;
                }
                while(*ptr != '\0'&&*ptr == ' ')ptr++;
                redirect_file = ptr;
                while(*ptr != '\0'&&*ptr != ' ')ptr++;
                *ptr = '\0';
            }
            ptr++;
        }

        ptr = cmd;
        char *arg[32] = {NULL};
        int ac = 0;
        //[   ls   -a   ]
        while(*ptr != '\0') {
            if (!isspace(*ptr)) {
                arg[ac] = ptr;
                ac++;
                while(*ptr != '\0' && !isspace(*ptr)) ptr++;
                *ptr = '\0';
            }
            ptr++;
        }
        arg[ac] = NULL;

        if (strcmp(arg[0], "cd") == 0) {
            chdir(arg[1]);
            continue;
        }

        pid_t pid = fork();
        if (pid < 0) {
            continue;
        }else if (pid == 0) {
            if (direct_flag == 1) {
                int fd;
                fd = open(redirect_file, 
                        O_CREAT|O_RDWR|O_TRUNC, 0664);
                dup2(fd, 1);
            }else if (direct_flag == 2) {
                int fd;
                fd = open(redirect_file, 
                        O_CREAT|O_RDWR|O_APPEND, 0664);
                dup2(fd, 1);
            }
            execvp(arg[0], arg);
            exit(-1);
        }
        wait(NULL);
    }
    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值