C:自定义外壳程序>重定向停止使用甚至无法运行的<代码

问题描述

我正在为一个类编写自定义外壳程序,并且正在使IO重定向正常工作。以下代码一个原型,但是如果不确定>代码,我不确定为什么我的// deal with <重定向不起作用。在我保留<部分的那一刻起,我对>重定向。我在做什么错了?

此外,在我execvp每条命令之前,我都会打印出命令参数。出于某种原因,当我输入带有>重定向的命令时,直到我输入另一个没有><的简单命令时,这些参数才会被打印出来。我已尝试删除close(fd)和其他一些内容,但是我不确定为什么在尝试打印命令自变量时stdout关闭的。

我在其中运行命令并处理>代码

// runs code
void runSimple(char **args)
{
    pid_t pid;
    pid = fork();
    int i = 0;
    int fd;

    if (pid < 0) // error
    {
        printf("An error occured while forking child for runSimple.\n");
        exit(-1);
    }
    else if (pid == 0) // child
    {
        // loop and deal with > or <
        while (args[i])
        {
            // deal with >
            if (!strcmp(args[i],">"))
            {
                printf("in >\n");
                fd = open(args[i + 1],O_RDWR | O_CREAT | O_Trunc,0644);
                printf("opened file: %s\n",args[i + 1]);
                if (fd < 0)
                {
                    perror("runSimple: error opening argument for >.");
                    exit(1);
                }
                dup2(fd,1); // make child's stdout into file
                close(fd);
                args[i] = NULL;
            }
            // deal with <
            // if (!strcmp(args[i],"<"))
            // {
            //     printf("in <\n");
            //     fd = open(args[i + 1],O_RDONLY);
            //     if (fd < 0)
            //     {
            //         perror("runSimple: error opening argument for <.");
            //         exit(1);
            //     }
            //     dup2(fd,0);
            //     close(fd);
            //     args[i] = NULL;
            // }

            i++;
        }

        // print out args before calling exec
        i = 0;
        while (args[i])
        {
            printf("cmd token: %s\n",args[i++]);
        }
        // exec input with appropriate fd
        execvp(args[0],args);
        perror("execvp");
    }
    // printf("am adult\n");
    int status;
    waitpid(pid,&status,0);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)