windows 匿名管道读取子进程输出
// Prepare pipe handles for standard output redirection
SECURITY_ATTRIBUTES saAttr;
// Set the bInheritHandle flag so pipe handles are inherited.
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
HANDLE hReadPipe, hWritePipe;
BOOL res = CreatePipe( &hReadPipe, &hWritePipe, &saAttr, 0 );
if ( ! SetHandleInformation(hReadPipe, HANDLE_FLAG_INHERIT, 0) )
{
LOG(ERROR<<"SetHandleInfomation fail.");
}
string strOutFile;
if ( !res )
{
return res;
}
else
{
STARTUPINFO si;
memset( &si, 0, sizeof( si ) );
si.cb = sizeof( si );
GetStartupInfo(&si);
// Hide DOS window
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdOutput = hWritePipe;
si.hStdInput = hReadPipe;
si.hStdError = hWritePipe;
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
wstring sFullCommand = L"wmic diskdrive list";
res = CreateProcess( NULL, (LPTSTR)(LPCTSTR)sFullCommand.c_str(), NULL, NULL, TRUE,
0, NULL, NULL, &si, &pi );
if (!res)
{
// process error of rsh
LOG(ERROR<<"CreateProcess fail.");
return ERR_ERROR;
}
else
{
// Close write pipe
CloseHandle( hWritePipe );
DWORD NumberOfBytesRead;
char Buffer[ 257 ];
while(::ReadFile( hReadPipe, Buffer, sizeof(Buffer)/sizeof(Buffer[ 0 ])-1,
&NumberOfBytesRead, NULL ) )
{
LOG(INFO<<Buffer<<" NumberOfBytesRead:"<<NumberOfBytesRead);
if (NumberOfBytesRead)
{
Buffer[ NumberOfBytesRead ] = TCHAR( 0 );
strOutFile += Buffer;
}
else
break;
};
LOG(INFO<<"LastError:"<<GetLastError());
// Close read pipe and wait for the finish
CloseHandle( hReadPipe );
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle (pi.hProcess);
res = TRUE;
}
}
参考:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx