linux 从另一个文件重定向输出时写入文件的问题

kpbwa7wx  于 2023-05-16  发布在  Linux
关注(0)|答案(1)|浏览(142)

我的任务是写一个‘小shell‘程序,但我遇到了问题,当我试图重定向输出,我会喜欢任何帮助。
首先,我要说一件对我来说最奇怪的事情:下面的命令给予了不同的打印,当我在bash中运行它们时:

./myshell < infile
./myshell < infile > outfile

其中一个(第一个)在重定向输入时设法写入文件,但第二个只创建文件,但我相信仍然将输出定向到'outfile'(尽管我不确定在这一点上,说实话)
下面是我的重定向代码:

int stdout_fd = dup(1); //keep the original output file descriptor
    int fd;
    fd = open(end.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666); //end is the file name
    //fd is not -1 here
    dup2(fd,1);
    executeCommand(start.c_str()); //goes to other function to do print something, using std::cout << ...
    close(1);
    dup2(stdout_fd, 1);
    close(stdout_fd);

这是一段相当简单的代码--保存文件描述符,打开你想写入的文件,把它放在标准输出的文件描述符中,然后恢复原来的文件描述符。就这些。
但是,它不起作用!我写的两行给予不同的输出(第一行打印了预期的输出),但我不明白在哪里!
在'infile'中,我写入一个名为'my_pid'的文件,在第一个命令中,它被正确写入并具有正确的数据,但在第二个命令中,如果文件不存在,则确实创建了该文件,但保留为空-数据被打印到'outfile'中。
我很乐意帮助你了解这个问题的根源,以及我能做些什么来解决它。谢谢!

i2byvkas

i2byvkas1#

经过几个小时的努力,我想我终于找到了问题的根源--没有冲水。
据我所知,在使用<< endl之后,刷新通常会自动发生。在上面的代码中我使用了

executeCommand(start.c_str());

但当它尝试打印时,打印结果并不是以<< endl;结尾
简而言之,解决方法是在继续之前将刷新添加到cout,在我的例子中,它就像

SmallShell::getInstance().executeCommand(start.c_str());
std::cout << flush;

不过我猜在每次打印后添加<<endl也会这样做。
我仍然没有完全理解需要刷新的缓冲区是什么,但这似乎是导致问题的原因。

相关问题