Shell中的重定向(C)

Shell中的重定向(C),c,shell,C,Shell,我正在尝试编写一个简单的shell,除了带有'>'的重定向之外,它都可以工作。有人建议我使用“>”分隔符来解析来自用户的输入字符串。输出字符串有两个元素,输出[0]是用户输入的整个命令,包括参数。输出[1]将是文件名 我的问题是,它创建了由输出[1]指定的文件,但没有写入任何内容!即使我将printf放入stdout,它也会写入终端 else if(*delim == '>'){ int

我正在尝试编写一个简单的shell,除了带有'>'的重定向之外,它都可以工作。有人建议我使用“>”分隔符来解析来自用户的输入字符串。输出字符串有两个元素,输出[0]是用户输入的整个命令,包括参数。输出[1]将是文件名

我的问题是,它创建了由输出[1]指定的文件,但没有写入任何内容!即使我将printf放入stdout,它也会写入终端

                        else if(*delim == '>'){
                            int f = open(output_str[1], O_WRONLY|O_CREAT|O_TRUNC, 0666);
                            int stdout_sv = dup(1); // Saving the current stdout descriptor for restoring later.
                            if(errno != 0){
                                    perror("");
                            }
                            dup2(f,1);
                            execvp(output_str[0], output_str);

                            printf("Sample Line to file.");
                            dup2(stdout_sv, 1); // Restoring stdout
                            close(f);
                    }
这将产生以下输出:

[04/04 15:55]# ls > test.txt
output_str[0] = ls 
output_str[1] =  test.txt
Sample Line to file.[04/04 15:55]# 
我真的很困惑为什么标准输出没有被重定向到输出文件(test.txt)。我的意思是输出文件是正确的


注意:我意识到test.txt之前有一个空格,我尝试过用“>”进行解析,删除了输出中的空格。\u str[1],文件仍然是空的。

缓冲是问题的根源。先刷新标准输出的缓冲区,然后再将其基础文件描述符恢复为标准输出。或者,您可以使用
write
进行无缓冲输出。我现在就试试。我的execvp()参数可以吗?可以。它现在正在写入“样本行到文件”,但是实际的命令输出没有写入文件。我对我的论点持怀疑态度。我看不到足够的代码来验证你的参数是否符合你的要求。我可以说,我认为它不会做你最终想要它做的事情。在编写时,假设
output\u str
如所述,则
ls
似乎只列出输出文件名,在本例中为
test.txt
。如果这是您所期望的,并且它不起作用,那么我肯定会检查您的
输出\u str
数组的内容。我还将补充一点,如果execvp起作用,您不应该期望得到样本行输出。它将替换当前可执行文件,如果成功,则不会继续处理代码。如果这不是您想要的,您可能希望
分叉