父进程是windows服务程序,一个win32控制台程序作为子进程。需要子进程的输出重定向到父进程中,使用windows匿名管道,发现子进程的输出要等到该进程退出后才能被父进程读取到,此外,子进程单独运行很正常,但是在父进程里创建后,使用管道读取时,发现占用CPU很高,而父进程占用CPU很正常,很难理解是父进程的读取函数被锁住了,因为父进程并没有CPU占用异常。
代码:
创建管道...
CreateProcess(......);
//读取线程
...
 while (true)
 {
  Sleep(20);
                    ReadFile(hReadPipe,buffer,4095,&bytesRead,NULL);
 .......  
 }
...

解决方案 »

  1.   

    http://topic.csdn.net/t/20030710/20/2014087.html
    以上这个帖子的一部分类似,但结论并没有解决问题,这里已经使用了线程机制进行读取了。
    此外,CPU占用异常的问题很奇怪,是父进程的读取引起,但是父进程CPU占用正常,而子进程
    却反而CPU异常了。
      

  2.   

    建议你把主要代码帖出来看一下,我也用过管道来实现启动win32 console程序,并实现了向它发送指令并接收返回的信息,但没有遇到你这种问题。
      

  3.   

    int CreateNewProcess(LPCSTR pszExeName)
    {
    UINT rtcode;
        PROCESS_INFORMATION piProcInfoGPS;
        STARTUPINFO siStartupInfo;
        SECURITY_ATTRIBUTES saProcess, saThread,sa;
    HANDLE hTemp;    ZeroMemory( &siStartupInfo, sizeof(siStartupInfo) );
        siStartupInfo.cb = sizeof(siStartupInfo);
        saProcess.nLength = sizeof(saProcess);
        saProcess.lpSecurityDescriptor = NULL;
        saProcess.bInheritHandle = true;
        saThread.nLength = sizeof(saThread);
        saThread.lpSecurityDescriptor = NULL;
        saThread.bInheritHandle = true;
        
    sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);   
        sa.lpSecurityDescriptor   =   NULL;
    sa.bInheritHandle   =   TRUE; 
    CreatePipe(&hReadPipe,&hWritePipe,&sa,0);  
    hTemp = GetStdHandle(STD_OUTPUT_HANDLE);
    siStartupInfo.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&siStartupInfo);
    siStartupInfo.wShowWindow = SW_HIDE;
    siStartupInfo.hStdOutput = hWritePipe;
    siStartupInfo.hStdError = hWritePipe;
    siStartupInfo.dwFlags =  STARTF_USESTDHANDLES| STARTF_USESHOWWINDOW ;//;// |;//|


    rtcode = CreateProcess( NULL, (LPTSTR)pszExeName, &saProcess, &saThread, false,CREATE_NO_WINDOW, NULL, NULL, &siStartupInfo,&piProcInfoGPS);
    nProcessID = piProcInfoGPS.dwProcessId;

    SetStdHandle(STD_OUTPUT_HANDLE, hTemp); 
    CloseHandle(hWritePipe);   return rtcode;}
      

  4.   

    只看到你的ReadFile了,有写WriteFile,匿名管道的话,必须有两个管道,一个负责读,一个负责写的,不然就会出现貌似阻塞的问题,我以前也出过类似问题,后来发现自己根本就没有创建写的管道