C语言 来自 freopen() 和流的奇怪行为



编辑:我已经设法缩小了问题的范围,但这对我来说仍然没有多大意义。我的代码变成 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呼叫,我敢打赌你会看到你期望的行为。

相关内容

  • 没有找到相关文章

最新更新