编辑:我已经设法缩小了问题的范围,但这对我来说仍然没有多大意义。我的代码变成 8 行:
int savedOut = dup(1);
printf("Changing the outstream to process.txt!")
if ( freopen("process.txt", "w"m stdout) == NULL)
printf("FREOPEN() FAILURE")
printf("Print to Filen");
dup2(savedOut, 1);
printf("Done with print to file");
return 1;
此代码将所有打印到终端。删除带有"savedOut"的两行打印所有要处理.txt。我理解后一种结果,但我不理解前者。
结束编辑
我在与freopen()
合作时遇到了很多困难。以这段代码为例:
int savedIn = dup(0);
int savedOut = dup(1);
while(1)
{
readFile[0] = ' ';
writeFile[0] = ' ';
dup2(savedIn, 0);
dup2(savedOut, 1);
if(getInputFlag == 1)
{
printf("myshell$ ");
gotInputFlag = getUserInput(arguments, command, readFile, writeFile, catOrApp, bkgdFlag);
}
else
{
gotInputFlag = getUserInput(arguments, command, readFile, writeFile, catOrApp, bkgdFlag);
}
if(gotInputFlag == 1)
{
history[historySize] = (char*)malloc(sizeof(char) * 1000);
if (writeFile[0] != ' ' && *catOrApp == 0)
{
printf("Changing the outstream!n");
freopen(writeFile, "w", stdout);
}
printf("Print to Filen");
dup2(savedIn, 0);
dup2(savedOut, 1);
printf("Done with print to file!n");
...
该程序将执行并打印"更改外流!",正如预期的那样。"打印到文件!"永远不会打印到终端或写入文件。"打印到文件完成!"也不会打印。稍后在代码中,代码调用 Hello World 程序上的execv()
,该程序按预期打印到终端。但是,在程序终止时,突然所有 printf 语句都打印到终端,甚至是"打印到文件"语句。
除了单个fgets()
,getUserInput()
不适用于流。
我一辈子都无法理解为什么会发生这种情况。有人知道吗?
这就是我认为正在发生的事情,都与流缓冲有关。 您从指向终端的标准输出开始。因为它是字符设备,所以流是行缓冲的。打印Changing the outstream to process.txt!
时没有换行符,因此文本保留在缓冲区中。您现在重新打开标准输出到文件;流将切换到完全缓冲。然后打印Print to Filen
尽管换行符仍保留在缓冲区中。
现在您使用 dup2 将标准输出更改回终端。但是,这适用于作为流基础的 fd。流库代码不知道此更改,并使流保持完全缓冲。您再次打印并退出,这会将流刷新到 fd(现在是您的终端)。
在每次printf
后添加fflush
呼叫,我敢打赌你会看到你期望的行为。