zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hive中使用正則表達式不当导致执行奇慢无比
    C/C++实现正负数四舍五入
    EEPlat的控制器概念
    由于好高骛远所以半途而废(张作作)
    新辰:关于“网络推广不能仅仅依靠网络”的详解
    SQL的事务回滚操作带案例分析
    怎样把引用的jar包和本项目一起导出成jar文件
    A星算法(Java实现)
    Hadoop之——HBASE结合MapReduce批量导入数据
    Spring MVC 数据验证——validate编码方式
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/3118276.html
Copyright © 2011-2022 走看看