在Cygwin上使用TCC编译
我正在测试一个用C编写的非常基本的程序,其全部内容附在下面。在尝试执行TCC生成的可执行文件时,我注意到在实际看到任何printf()调用的输出之前,需要为每个连续的fgets()输入输入 这非常令人困惑,所以我决定尝试在标准Windows控制台上运行可执行文件。它运行完美,输入和输出提示按正确的顺序显示 然而,我注意到,如果我用GCC编译程序,它将在用Cygwin编译的终端上正常工作(mintty,尽管我用rxvt得到了相同的结果) 有谁能解释一下为什么会发生这种情况,以及我怎样才能阻止它发生?我希望编译我的程序独立于Cygwin,同时仍然使用基于Cygwin的终端 谢谢在Cygwin上使用TCC编译,c,terminal,cygwin,printf,fgets,C,Terminal,Cygwin,Printf,Fgets,我正在测试一个用C编写的非常基本的程序,其全部内容附在下面。在尝试执行TCC生成的可执行文件时,我注意到在实际看到任何printf()调用的输出之前,需要为每个连续的fgets()输入输入 这非常令人困惑,所以我决定尝试在标准Windows控制台上运行可执行文件。它运行完美,输入和输出提示按正确的顺序显示 然而,我注意到,如果我用GCC编译程序,它将在用Cygwin编译的终端上正常工作(mintty,尽管我用rxvt得到了相同的结果) 有谁能解释一下为什么会发生这种情况,以及我怎样才能阻止它发生
int main()
{
char something[12];
printf("This printf() should be outputted before you are prompted for input: ");
fgets(something, sizeof something, stdin);
printf("You entered, %s", something);
}
这取决于标准输入和标准输出的缓冲。我不确定C标准对这个(C++中的流是默认绑定)的说明,但是你可以用标准的输出来刷新标准输出:
fflush( stdout );
调用printf.后,这取决于标准输入和标准输出的缓冲。我不确定C标准对这个(C++中的流是默认绑定)的说明,但是你可以用标准的输出来刷新标准输出:
fflush( stdout );
调用printf.后,标准输出流通常是行缓冲的,即打印换行时缓冲区被刷新 您可以使用以下命令显式刷新它:
fflush(stdout);
您可以通过以下方式关闭给定流s
的缓冲:
setvbuf(s, NULL, _IONBF, 0);
有关更多详细信息,请参阅。标准输出流通常是行缓冲的,即当您打印换行时,缓冲区会被刷新 您可以使用以下命令显式刷新它:
fflush(stdout);
您可以通过以下方式关闭给定流s
的缓冲:
setvbuf(s, NULL, _IONBF, 0);
有关更多详细信息,请参阅。Mintty和rxvt是基于Unix的终端仿真器。Cygwin基于 使用Cygwin gcc编译程序时,它会链接到Cygwin DLL,该DLL包含使连接到终端的流在Unix系统上正常工作的所有魔法,这意味着默认情况下是行缓冲
但是,使用tcc编译程序时,会创建一个本机Windows程序,该程序只会看到底层的Windows管道。在Microsoft C库中,连接到管道的流在默认情况下是完全缓冲的,这就是为什么使用
fflush(stdout)
显式刷新或使用setvbuf(stdout,NULL,_IONBF,0)
禁用缓冲的原因。MS的C库不支持行缓冲。Mintty和rxvt是基于Unix的终端模拟器。Cygwin基于
使用Cygwin gcc编译程序时,它会链接到Cygwin DLL,该DLL包含使连接到终端的流在Unix系统上正常工作的所有魔法,这意味着默认情况下是行缓冲
但是,使用tcc编译程序时,会创建一个本机Windows程序,该程序只会看到底层的Windows管道。在Microsoft C库中,连接到管道的流在默认情况下是完全缓冲的,这就是为什么使用
fflush(stdout)
显式刷新或使用setvbuf(stdout,NULL,_IONBF,0)
禁用缓冲的原因。MS的C库不支持行缓冲。默认情况下,stdout在发送到终端时是行缓冲的,而在发送到其他对象(管道、套接字、文件等)时是完全缓冲的。相比之下,stderr在默认情况下是无缓冲的(因为它用于写入可以诊断崩溃原因的信息,可能是在自动刷新缓冲区之前).@Donal Yep,这是标准所说的,也是Cygwin实现的,但不是Microsoft C库。在那里,stdout和stderr在连接到控制台时都是无缓冲的,在连接到文件或管道时都是完全缓冲的。行缓冲不受支持。@ak2:这就是为什么我没有将其作为解决方案提供的原因。MS fluffing还没有C库的er部分并不奇怪……默认情况下,stdout在发送到终端时是行缓冲的,而在发送到其他对象(管道、套接字、文件等)时是完全缓冲的。相比之下,stderr在默认情况下是无缓冲的(因为它用于写入可以诊断崩溃原因的信息,可能是在自动刷新缓冲区之前).@Donal Yep,这是标准所说的,也是Cygwin实现的,但不是Microsoft C库。在那里,stdout和stderr在连接到控制台时都是无缓冲的,在连接到文件或管道时都是完全缓冲的。行缓冲不受支持。@ak2:这就是为什么我没有将其作为解决方案提供的原因。MS fluffing还没有呃,C库的一部分并不奇怪……在所有答案中,我认为这一个有最彻底的解释,这就是为什么我选择它作为“最佳”答案。谢谢大家!在所有答案中,我认为这一个有最彻底的解释,这就是为什么我选择它作为“最佳”答案。谢谢大家!