读书人

管道重定向子进程输入时的异常

发布时间: 2012-04-13 13:50:24 作者: rapoo

管道重定向子进程输入时的错误
首先我把代码贴出来吧.

Delphi(Pascal) code
sa.nLength:= SizeOf(sa);  sa.lpSecurityDescriptor:= nil;  sa.bInheritHandle:= True;  if not CreatePipe(hOutRead, hOutWrite, @sa, 0) then  begin    ShowMessage('CreatePipe Error!!!');    Exit;  end;  ZeroMemory(@Buf[0],1024);  ZeroMemory(@si, SizeOf(si));  si.cb:= SizeOf(si);  si.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;  si.wShowWindow:= SW_HIDE;  si.hStdOutput:= hOutWrite;  si.hStdError:= hOutWrite;  if not CreateProcess(nil,'E:\MinGW\Bin\gcc.exe c:\2_3.c -o c:\2_3.exe -O2 -Wall -lm -DONLINE_JUDGE',nil,nil,True,CREATE_NEW_CONSOLE,nil,nil,si,pi) then  begin    ShowMessage('CreateProcess Error!!!');    Exit;  end;  case WaitForSingleObject(pi.hProcess, 2000) of    WAIT_OBJECT_0:      begin        CloseHandle(hOutWrite) ;        if ReadFile(hOutRead,Buf, 1024, dwCount, nil) then        begin          ShowMessage('GetReadBack: ' + StrPas(PChar(@buf[0])));        end        else        begin          dwCount:= GetLastError;          ShowMessage(IntToStr(dwCount));        end;                end;    WAIT_TIMEOUT:      TerminateProcess(pi.hProcess, 100);  end;  CloseHandle(pi.hProcess);  CloseHandle(pi.hThread);

调试过程中,发现ReadFile返回false了,而GetLastError返回109也就是Error_Broken_Pipe
如果在ReadFile前不关闭写入端hOutWrite的话,ReadFile函数会阻塞.
求解,如何解决这个问题.

[解决办法]
不等待进程,直接ReadFile

读书人网 >.NET

热点推荐