Visual Studio에서 출력 창이나 다른 도구 창에서 수행하는 작업과 비슷합니다. 프로세스 A에서 다른 프로세스 B를 시작하고 stdout/stderr 출력을 캡처합니다.대기 시간없이 Win32에서 다른 프로세스의 stdout을 캡처하는 방법은 무엇입니까?
지금까지 CreatePipe()
으로 작업했는데 어떤 이유로 B 출력이 작성되면 B 출력에 도달하지 않습니다. 어떤 종류의 버퍼가 채워지는 것처럼 동작하며, 버퍼가 가득 차면 모든 버퍼 내용이 한 번에 A에 도착합니다. 나는 뭔가를 출력하고 나중에 직접 fflush(stdout)
을 수행하는 자체 테스트 프로그램을 작성했습니다. 그런 다음 출력물이 A에 직접 도착합니다. 그런 식으로 사용하려는 모든 B 프로세스의 코드를 변경할 수는 없습니다. A에서 파이프를 플러시하려고해도 작동하지 않습니다.
어떻게 작동하나요?
내 초기화 코드뿐만 아니라 소모 코드 :
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
err = CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &sa, stdouthistory);
if (err == 0)
return 1;
err = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,
GetCurrentProcess(), &hChildStdoutRdDup , 0,
FALSE,
DUPLICATE_SAME_ACCESS);
if (err == 0)
return 3;
CloseHandle(hChildStdoutRd);
DWORD a, b, c;
a = PIPE_READMODE_BYTE | PIPE_NOWAIT;
b = 0;
c = 0;
SetNamedPipeHandleState(hChildStdoutRdDup, &a, &b, &c);
err = CreatePipe(&hChildStdinRd, &hChildStdinWr, &sa, stdinhistory);
if (err == 0)
return 1;
err = DuplicateHandle(GetCurrentProcess(), hChildStdinWr,
GetCurrentProcess(), &hChildStdinWrDup , 0,
FALSE,
DUPLICATE_SAME_ACCESS);
if (err == 0)
return 4;
CloseHandle(hChildStdinWr);
a = PIPE_READMODE_BYTE | PIPE_NOWAIT;
b = 0;
c = 0;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.wShowWindow = SW_SHOW;
si.hStdOutput = hChildStdoutWr;
si.hStdError = hChildStdoutWr;
si.hStdInput = hChildStdinRd;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
err = CreateProcess(0, this->cmdline, 0, 0, true, CREATE_NO_WINDOW, 0, 0, &si, &pi);
if (err == 0)
return 4;
소비 :
DWORD avail;
unsigned int ofs = 0;
if (PeekNamedPipe(hChildStdoutRdDup, NULL, 0, NULL, &avail, NULL))
{
if (avail != 0)
{
int err = ReadFile(hChildStdoutRdDup, s + ofs, slen, &threadbuffern, 0);
// Consume ...
}
}
편집 : Continuously read from STDOUT of external process in Ruby : 난 그냥이 질문을 발견했다. 루비의 맥락에서와 같은 문제입니다. 슬프게도 해결책은 Ruby 라이브러리를 사용하는 것입니다. 그 도서관은 어떻게합니까? Win32/C++에서 동등한 것은 무엇입니까?
연결된 스레드는 * nix 솔루션입니다. Win32와 비슷한 것은 없습니다. –
유닉스에만 관련이 있다는 것을 어떻게 알 수 있습니까? 또한 잘 닫을 수있는 프로그램이 Windows에 있습니다./ – marc40000