如果只想显示子进程的stdout和stderr到父进程的控制台,可以在子进程中使用AttachConsole(ATTACH_PARENT_PROCESS)附加到父进程的控制台。或者在parent中,指定CreateProcess的dwCreationFlags为0,根据Creation of a Console:
默认情况下,控制台进程继承其父控制台。
(不能保证输入会被预期的进程接收。请确保您不需要为子进程使用标准输入)
但是,此方法无法与父进程交互。如果父进程需要获取这些输出数据,仍然需要通过进程间通信将数据发送给父进程。
该方法允许子进程和父进程使用同一个控制台,但是父进程不能直接获取子进程的输出数据。如果父进程需要获取数据,仍然需要使用Interprocess Communications将数据发送给父进程。
编辑:
这里是示例
孩子:
#include <windows.h>
#include <iostream>
int main(VOID)
{
AttachConsole(ATTACH_PARENT_PROCESS);
int i = 5;
while (i--)
{
printf("printf\n");
std::cout << "child " << i << std::endl;
fflush(stdout);
Sleep(1000);
}
return 0;
}
父母:
#include <windows.h>
#include <iostream>
int main()
{
STARTUPINFO si = {};
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi = {};
WCHAR cmd[] = L"Path\\child.exe";
SECURITY_ATTRIBUTES se = {};
se.nLength = sizeof(SECURITY_ATTRIBUTES);
se.bInheritHandle = true;
se.lpSecurityDescriptor = NULL;
HANDLE hFile = CreateFileW(L"test.txt", GENERIC_WRITE, FILE_SHARE_READ, &se, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
BOOL ret = SetStdHandle(STD_OUTPUT_HANDLE, hFile);
printf("parent1\n");
ret = CreateProcessW(cmd, NULL, 0, 0, 1, 0, 0, 0, &si, &pi);
std::cout << "parent2 " << std::endl;
WaitForSingleObject(pi.hProcess,INFINITE);
system("pause");
}
结果:
另一个示例:
孩子
int main(VOID)
{
//AttachConsole(ATTACH_PARENT_PROCESS);
int i = 5;
while (i--)
{
printf("printf\n");
std::cout << "child " << i << std::endl;
fflush(stdout);
Sleep(1000);
}
return 0;
}
父母
int main()
{
SECURITY_ATTRIBUTES se = {};
se.nLength = sizeof(SECURITY_ATTRIBUTES);
se.bInheritHandle = true;
se.lpSecurityDescriptor = NULL;
HANDLE hFile = CreateFileW(L"test.txt", GENERIC_WRITE, FILE_SHARE_READ, &se, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
BOOL ret = SetStdHandle(STD_OUTPUT_HANDLE, hFile);
printf("parent1\n");
STARTUPINFO si = {};
si.cb = sizeof(STARTUPINFO);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi = {};
WCHAR cmd[] = L"Path\\child.exe";
CreateProcessW(cmd, NULL, 0, 0, 1, 0, 0, 0, &si, &pi);
std::cout << "parent2 " << std::endl;
WaitForSingleObject(pi.hProcess, INFINITE);
system("pause");
}