构建简单 shell 时的文件重定向问题

问题描述 投票:0回答:1

我正在尝试在我的简单 shell 程序中实现文件重定向。问题是,当我在运行我的 shell 程序来测试它时输入提示(例如 ./test1 > test2 )而不是执行命令并进入下一个提示时,它有点平静并继续接收输入以重定向到我的test2文件。不知道该怎么办。

for(int i = 1; i < arg_no; i++){
        if (strcmp(arg[i], ">") == 0){
                fd = open(arg[i+1], O_WRONLY | O_CREAT,  S_IRUSR|S_IWUSR|S_IRGRP);
                if (fd < 0) {
                    perror("open");
                    exit(1);
                }
                close(STDOUT_FILENO);
                if (dup(fd) < 0) {
                    perror("dup");
                    exit(1);
                }
                close(fd);
                arg[i] = NULL;
               break;
        }
        else if(strcmp(arg[i], ">&") == 0){
                fd = open(arg[i+1], O_WRONLY | O_CREAT, 0644);
                dup2(fd, STDOUT_FILENO);
                dup2(fd, STDERR_FILENO);
                close(fd);
                arg[i] = NULL;
        }
        else if(strcmp(arg[i], ">>") == 0){
                fd = open(arg[i+1], O_WRONLY | O_CREAT | O_APPEND, 0644);
                dup2(fd, STDOUT_FILENO);
                close(fd);
                arg[i] = NULL;
        }
        else if(strcmp(arg[i] , ">>&") == 0){
                fd = open(arg[i+1], O_WRONLY | O_CREAT | O_APPEND, 0644);
                dup2(fd, STDOUT_FILENO);
                dup2(fd, STDERR_FILENO);
                close(fd);
                arg[i] = NULL;
        }
        else if(strcmp(arg[i], "<") == 0){
                fd = open(arg[i+1], O_RDONLY);
                dup2(fd, STDIN_FILENO);
                close(fd);
                arg[i] = NULL;
        }
    }

我在 dup(fd) 之后的 printf 语句没有任何效果,所以我假设程序无法关闭(fd),这就是发生这种情况的原因。我只是不确定这是为什么或如何强制关闭它。

c shell file-descriptor io-redirection dup
1个回答
1
投票

如果你在你的 Linux shell 中输入:

./test1 > test2

然后

test1
argc == 1
执行,没有额外的参数。特别是,
> test2
不会传递给您的程序。您正在输入的实际 shell 会删除这些并为您进行文件重定向。

如果您的程序需要解释包含

<
>
的字符串,您需要将它们括在括号中,例如

./test1 "> test2"

您必须处理这个参数是单个字符串,而不是一系列 argv[] 指针的事实。

© www.soinside.com 2019 - 2024. All rights reserved.