我的任务是写一个‘小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'中。
我很乐意帮助你了解这个问题的根源,以及我能做些什么来解决它。谢谢!
1条答案
按热度按时间i2byvkas1#
经过几个小时的努力,我想我终于找到了问题的根源--没有冲水。
据我所知,在使用
<< endl
之后,刷新通常会自动发生。在上面的代码中我使用了但当它尝试打印时,打印结果并不是以
<< endl;
结尾简而言之,解决方法是在继续之前将刷新添加到cout,在我的例子中,它就像
不过我猜在每次打印后添加
<<endl
也会这样做。我仍然没有完全理解需要刷新的缓冲区是什么,但这似乎是导致问题的原因。