如何在cygwin下进行AllocConsole + Stdout重定向

时间:2012-01-16 15:23:29

标签: c console cygwin redirect stdout

我有一个复杂的>> cygwin<< Windows应用程序(又名子系统窗口),我想添加一个调试控制台。我已经尝试了以下变体,但没有一个适用于我。

控制台显示标题已更改,但仍为黑色,未显示输出。

变式1)

ok = AllocConsole();
if (ok) {
    h = GetStdHandle(STD_OUTPUT_HANDLE);
    fd = _open_osfhandle((intptr_t)h, O_TEXT);
    fp = _fdopen( fd, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );
    fprintf(stdout, "Hello worldd\n");
    SetConsoleTitle("VM Debug");
}

变式2)

freopen("conout$","w",stdout);
fprintf(...

变式3)

freopen("/dev/conout","w",stdout);
fprintf(...

这可能已经多次回答,但没有一个解决方案适合我。

任何人都可以帮助我吗?

但请记住:它必须是一个cygwin问题,我需要一个cywin解决方案,因为我知道一个或另一个变体在MSVC或BorlandC下工作。 任何答案都有帮助,即使有人说cygwin被打破了,而且没有解决方案。

1 个答案:

答案 0 :(得分:1)

是的,这是一个cygwin问题。 Cygwin的家伙实际上已经努力模拟尽可能多的“unix”环境,所以常见的W32技巧无法奏效。无论如何,您可以使用WriteConsole函数在新控制台上编写消息,但我发现它不是您想要的。在过去,我遇到了类似的问题,广告通过创建一个pipe(),将其重定向到stdout / stderr来解决它,并创建一个从管道端接收字符的线程通过WriteConsole将它们写入新控制台。不容易。

另外,我认为cygwin的控制台管理已经使用不同的版本多次更改,所以也许一个似乎与一个版本一起使用的技巧会停止使用另一个版本。

这是一个狂野的世界......