Win32 ReadFile hängt beim Lesen von Rohr

Ich bin ein Kind-Prozess, und die Lektüre seiner Ausgabe. Mein code funktioniert, wenn der Kind-Prozess erzeugt die Ausgabe (cmd /c echo Hello World), jedoch ReadFile hängen, wenn der Prozess nicht erstellen-Ausgang (cmd /c echo Hello World > output.txt). Ich bin nur das Lesen, nach dem der Prozess beendet wurde.

Mache ich etwas furchtbar falsch??? Gibt es trotzdem, dies zu tun mit synchronen Modus, oder muss ich die asynchrone Modus? All dies geschieht in einem separaten thread, so dass ich glaube nicht, dass der asynchrone Modus anbieten würde, keinen nutzen für mich, es sei denn, es ist der einzige Weg, um diese zu arbeiten. Vielen Dank!

saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 

CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0);
SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0);

memset(&piProcInfo, 0, sizeof(PROCESS_INFORMATION));
memset(&siStartInfo, 0, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO); 
siStartInfo.hStdError = g_hChildStd_OUT_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, commandWideString, NULL, NULL, TRUE, 0, NULL, NULL, &siStartInfo, &piProcInfo);

while(1)
{
    GetExitCodeProcess(piProcInfo.hProcess, &processExitCode);
    if(processExitCode != STILL_ACTIVE)
        break;
    else
        Sleep(1);
}

*output = (char *)calloc(32, sizeof(char));
processOutputSize = 0;
while(1)
{
    bSuccess = ReadFile( g_hChildStd_OUT_Rd, processOutputTemp, 32, &dwRead, NULL);
    if(!bSuccess || !dwRead)
        break;
    memcpy(*output + processOutputSize, processOutputTemp, dwRead);
    processOutputSize += dwRead;
    if(dwRead == 32)
        *output = (char *)realloc(*output, processOutputSize + 32);
    else
    {
        memset(*output + processOutputSize, 0, 1);
        break;
    }
}
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
CloseHandle(g_hChildStd_OUT_Rd);
CloseHandle(g_hChildStd_OUT_Wr);
  • Ich habe behandelt mit einer Sperrung readfile, und meistens ist es ein nicht geschlossenes handle, die bewirkt, dass die Lesen, um zu blockieren. Nachdem Ihr Kind-Prozess beendet, Sie könnten in der Nähe der Griff der write-Ende der pipe. Funktioniert diese Hilfe?
  • es hilft. Wenn der Prozess kehrt Ausgabe ReadFile gelingen wird, als normal. Wenn der Prozess nicht wieder ausgegeben ReadFile fehl und GetLastError() wird return-code 109 - Error Broken Pipe. Ist dieses Verhalten zu erwarten? Danke.
InformationsquelleAutor Matt | 2012-12-11
Schreibe einen Kommentar