带\ n或\ r \ n的C90 printf无法在cygwin中运行;但是fflush(stdout);工作良好。为什么?

时间:2013-08-01 03:12:30

标签: c gcc cygwin printf

Cygwin64位

编译命令:

gcc hello.c -o hello -ansi -pedantic-errors

运行命令

./hello

的hello.c

#include<stdio.h>
int main() {
    /*setbuf(stdout, 0);        I KNOW THIS WILL WORK IF ADDED, it is a solution, but I want to know why line break itself is not working*/
    printf("hello world!\n");
    printf("hello world again!\r\n");
    /*fflush(stdout);           without fflush, the above strings are not showing*/

    while(1)
    {
    }
}

问题:

  1. 我不想在每个printf后让fflush让终端及时显示字符串,那怎么样?

    答案:setbuf(stdout,0);

  2. 为什么“\ n”或“\ r \ n”在我的情况下不起作用,考虑到很多帖子指出换行符会解决问题?

  3. cygwin的终端是否与普通的Linux终端不同?既然我没有安装linux,那么有人给我测试吗?

  4. 或者让我问一个更一般的问题:在哪种终端上,句子“新线会强制冲洗”是真的吗?

  5. 由于

4 个答案:

答案 0 :(得分:2)

似乎在Cygwin中,stdout未被识别为终端(但作为管道),因此默认情况下它不是行缓冲的。

基于this answer,也许与Cygwin DLL链接会有所帮助。

答案 1 :(得分:1)

我对cgywin一无所知。但是我在这里做了一个测试。

我尝试下面的代码,并通过以下方式编译:gcc -std = c90 filename.c

没有fflush它在循环之前打印所有单词,所以我认为换行符刷新缓冲区!它只是工作!

我使用SUSE gcc。

#include<stdio.h>
int main() {
    /*setbuf(stdout, 0);        I KNOW THIS WILL WORK IF ADDED, it is a solution, but I want to know why line break itself is not working*/
    printf("hello world!\n"); /*without fflush, not shown*/
    printf("hello world again!\r\n"); /*without fflush, not shown*/
  /* fflush(stdout);*/

    while(1)
    {
    }
}

答案 2 :(得分:1)

该程序适用于32位Cygwin。具体来说,当我编译并执行该程序时:

#include<stdio.h>
int main() {
    /*setbuf(stdout, 0);        I KNOW THIS WILL WORK IF ADDED, it is a solution, but I want to know why line break itself is not working*/
    printf("hello world!\n");
    printf("hello world again!\r\n");
    /*fflush(stdout);           without fflush, the above strings are not showing*/

    while(1)
    {
    }
}

它产生这个输出:

hello world!
hello world again!

然后挂起,直到我用 Ctrl-C 杀死它。

我得到了在Windows控制台,mintty和xterm下从bash调用程序的相同行为(我怀疑终端会有什么不同)。

我在64位Windows 7下使用32位Cygwin。你说你使用的是64位Cygwin,just announced a few days ago;我还没有尝试过。

我怀疑64位与32位Cygwin存在问题。我建议你发帖到Cygwin mailing list

这是您的程序的清理版本,应该会出现同样的问题(请验证评论是否正确):

#include <stdio.h>
int main(void) {
    /* Adding setbuf(stdout, 0) here makes the output appear */
    printf("hello world!\n");
    /* Adding fflush(stdout) here makes the output appear */
    while(1) {
        /* nothing */
    }
}

答案 3 :(得分:0)

我刚刚遇到这个问题。我有一些代码我已经工作了一段时间,不得不在我的电脑上重新安装Cygwin。我这次安装了64位版本,以前是x86。

构建我的代码,在bash shell中运行它,没有输出。

我没有意识到我的bin文件夹中仍存在来自之前32位cygwin的Cygwin1.dll。我重命名了这个并运行了我的程序,输出工作正常。

您可能遇到了其他问题,但如果您使用bin其他文件夹中有不同的dll版本,则可能会导致此问题。