【问题标题】:Redirect stdout to parent process console window将标准输出重定向到父进程控制台窗口
【发布时间】:2015-02-11 12:37:15
【问题描述】:

我想实现以下情况:

  • 父进程(即cmd.exe有自己的控制台)
  • 子进程 myapp.exe 应该创建新的控制台窗口
  • 在子进程中,写入标准输出应写入父进程控制台
  • 如果子进程的标准输出被重定向到一个文件,保持原样

我已经设法以这种方式创建了单独的控制台:

#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;
} 

(在标准输出重定向到文件的情况下可以正常工作:myapp.exe > 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;
} 

【问题讨论】:

  • TL;DR;你要Pipe吗?
  • 在创建新的控制台窗口后,我希望能够写入我的应用程序在开始时(在我从默认控制台分离之前)能够写入的流。如果您认为管道可以帮助我以这种方式工作,请对这种解决方案有所了解。

标签: c++ c winapi stdout windows-console


【解决方案1】:

一个进程只能直接写入它所连接的控制台。如果子进程是使用自己的控制台创建的,或者一旦启动就分配自己的控制台,则它不能随后写入父控制台。

如果父进程创建了一个匿名管道,它可以使用写句柄作为子进程的标准输出。父进程需要为管道提供服务;例如它可能有一个线程从管道读取数据并将其写入自己的控制台。

子进程不必担心它是写入文件还是父进程。这将是标准输出的正常 I/O。

【讨论】:

  • 我不能同意你的第二个说法。最初,两个进程共享同一个控制台。不幸的是,您当时可能 100% 正确地认为进程可以写入 1 个控制台,即附加的控制台。 +1。
  • @Anonymous 我已经澄清过了。
猜你喜欢
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多