1

Cygwin64位

编译命令:

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

命令运行

./hello

你好ç

#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. 或者让我问一个更一般的问题:在哪种终端上,“新行将强制刷新”这句话是正确的?

谢谢

4

4 回答 4

2

似乎在 Cygwin 中,stdout它没有被标识为终端(而是管道),因此默认情况下它不是行缓冲的。

基于这个答案,也许与 Cygwin DLL 链接会有所帮助。

于 2013-08-01T06:18:59.723 回答
1

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

我尝试下面的代码,并编译: 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)
    {
    }
}
于 2013-08-01T06:04:15.177 回答
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 ;我还没试过。

我怀疑 64 位与 32 位 Cygwin 存在问题。我建议您发布到Cygwin 邮件列表

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

#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 */
    }
}
于 2013-08-01T07:31:19.027 回答
1

我刚遇到这个问题。我有一些我一直在研究的代码,不得不在我的电脑上重新安装 Cygwin。我这次安装的是64位的版本,之前是x86的。

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

我没有意识到我的 bin 文件夹中还有一个来自以前 32 位版本的 cygwin 的 Cygwin1.dll。我重命名了它并运行了我的程序并且输出有效。

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

于 2016-01-07T17:09:52.993 回答