#include <windows.h>
#include <wincon.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main(int argc, char* argv[])
{
printf("output displayed in parent process\n");
FreeConsole();
AllocConsole();
printf("output displayed in child process console\n");
// how do I redirect stdout to
// that one I've had before FreeConsole?
return 0;
}
(当stdout重定向到文件时,它工作正常:myapp.exe&gt; out.txt)
int main(int argc, char* argv[])
{
printf("output displayed in parent process\n");
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
FreeConsole();
AllocConsole();
printf("output displayed in child process console\n");
SetStdHandle(STD_OUTPUT_HANDLE,hStdOut);
printf("no success 1\n");
return 0;
}
int main(int argc, char* argv[])
{
printf("output displayed in parent process\n");
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
int fd = _open_osfhandle((intptr_t)hStdOut, _O_TEXT);
FreeConsole();
AllocConsole();
printf("output displayed in child process console\n");
FILE* hf = _fdopen( fd, "w" );
*stdout = *hf;
setvbuf( stdout, NULL, _IONBF, 0 );
printf("no success 2\n");
return 0;
}
答案 0 :(得分:3)
进程只能直接写入它所连接的控制台。如果使用自己的控制台创建子进程,或者在启动时分配自己的控制台,则无法随后写入父控制台。
如果父进程创建了一个匿名管道,它可以使用write句柄作为子进程的stdout。父进程需要为管道提供服务;例如它可能有一个线程从管道读取数据并将其写入自己的控制台。
子进程不必担心它是写入文件还是父进程。这对stdout来说都是正常的I / O.