C语言 重定向控制台(或标准输出)到命名管道不再工作时,与Visual Studio 2015编译



我有一个脚本引擎,它将其标准输出重定向到一个命名管道以进行调试。下面的代码自Visual Studio 6以来一直在工作,但在VS2015编译时似乎不再工作。不会抛出任何错误,但输出将继续写入控制台,而不是写入命名管道。当我在VS2012中编译这个应用程序时,它按预期工作。

hNamedPipe是我想重定向控制台文本到的管道。

int hCrt = _open_osfhandle((intptr_t)hNamedPipe, _O_TEXT);
FILE *hf = _fdopen(hCrt, "w");
*stdout = *hf;
setvbuf(stdout, NULL, _IONBF, 0);

我如何重定向stdio到一个命名管道时,编译与Visual c++ v14平台工具集?

多亏了James McNellis,我才找到了一个解决方案:

这是设计的。FILE是一个不透明的数据类型;你不能这么做像你在代码中所做的那样取消对文件的引用。

这是最终为我工作的代码:

void main()
{
    HANDLE hNamedPipe = Create_Some_Named_Pipe();
    RedirectIO(stdout, hNamedPipe);
    printf("Hello World."); //This arrived at the listening named pipe.
}
void RedirectIO(FILE *hFrom, HANDLE hTo)
{
    int fd = _open_osfhandle((intptr_t)hTo, _O_WRONLY | _O_TEXT);
    _dup2(fd, _fileno(hFrom));
    setvbuf(hFrom, NULL, _IONBF, 0); //Disable buffering.
}

最新更新