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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leiten Sie die Ausgabe des Prozesses in ein Rohr, den Prozess zu starten, warten Sie, bis es beendet wird, und dann die Ausgabe Lesen.
Das problem ist, dass windows-Puffer nur eine begrenzte Menge von Daten. Sie müssen also Lesen Sie die Pfeife, während der Prozess noch läuft, andernfalls wird der Prozess blockiert, weil es kann nicht mehr schreiben, Daten in die pipe.
Sollten Sie schließen Sie die schreib-Ende der Ausgabe-Rohr, bevor Sie Lesen, wie @Marcus schlug vor, in den Kommentar.
CloseHandle(g_hChildStd_OUT_Wr);
Dies ist für mich die richtige Antwort.
Könnten Sie PeekNamedPipe in eine Schleife wie diese: